• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

SpecialOne

Apontadores e strings

7 mensagens neste tópico

Tenho de ler um nome completo e copiar para outra string com o seguinte formato, o apelido no principio, seguido pelo

nome proprio e substituindo cada nome intermedio pela sua primeira letra.

Como não da para devolver um array depois de invocar uma função auxiliar `a partida tenho de usar apontadores,

tenho algo do tipo:

int main(){

char s1[ N ];
char s2[ N ];

char *aux;

aux = &s2;

printf("Introduza o seu nome completo:\n");
gets(s1);

ultimoNome(s1,aux);    aqui o aux seria para "devolver" o resultado.

onde

int ultimoNome(char *s, char *aux){

int i = strlen(s)-1;
int j;

/* Este ciclo for vai percorer o arrya de tras para a frente e vai descobrir o primeiro espaço de forma a indicar a posição do array
onde começa o Apelido */

for(;s[ i ] != ' ';i--) {}

/* Este for vai copiar para o array auxiliar o Apelido */

for(j=0,i = i+1;s[i]!='\0';j++,i++){
aux[j] = s[i];
			   }

/* A proxima linha é para colocar um espaço antes do proximo nome */

aux[j] = ' ';

/* Retorna o valor de j para saber ate onde escreveu no array aux */

return 0;
}

Preciso de algumas luzes de como usar apontadores com strings,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um array não passa de um apontador... Não precisas do aux para nada, podes usar directamente o s2.

De resto, não percebi exactamente qual era o problema. E já agora, troca o gets pelo fgets.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não entendi bem o que queres fazer, mas isso poderá simplesmente ser feito ao procurares espaços...

Tipo... Se o nome completo for João Silva Castro, com um while s1 != ' '.. incrementas o i até saberes a posição do espaço... depois de saber a posição do 1º espaço já tens o teu nome proprio que vai da posição 0 até á do espaço... depois fazes o mesmo até dar a posição do ultimo espaço e daí até ao fim da string já tens o teu apelido... quanto ás letras dos nomes dos meios, os espaços entre o valor do 1º espaço e do ultimo adicionas 1 á posição e lá tens a tua inicial...

Depois com 1 simples strcat juntas tudo conforme te convém...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema ja esta quase resolvido, o codigo ficou:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define N 100

int ultimoNome(char *s, char *aux){

int i = strlen(s)-1;
int j;

/* Este ciclo for vai percorer o arrya de tras para a frente e vai descobrir o primeiro espaço de forma a indicar a posição do array
onde começa o Apelido */

for(;s[i] != ' ';i--) {}

/* Este for vai copiar para o array auxiliar o Apelido */

for(j=0,i = i+1;s[i]!='\0';j++,i++){
aux[j] = s[i];
			   }

/* A proxima linha é para colocar um espaço antes do proximo nome */

aux[j] = ' ';

/* Retorna o valor de j para saber ate onde escreveu no array aux */

return j;
}

int primeiroNome(char *s, char *aux, int j){

/* Este for vai agora colocar o primeiro nome asseguir ao apleido */

int k,g;
int tmp;

for(k=0; s[k] != ' ';k++,j++){
aux[j] = s[k];
			     }

/* Este for vai colocar asseguir ao primeiro nome as iniciais dos nomes 
intermedios */

for(g=k ; s[g] != '\0'; g++){

if (isupper(s[g])) { aux[j] = ' ';
		     aux[j+1] = s[g];
		     j=j+2;
		  }	
}
tmp = strlen(aux);

return tmp;
}


int main(){

char s1[N];
char s2[N];

int comp;
int i,h;
int tmp, tmp2;

printf("Introduza o seu nome completo:\n");
gets(s1);

/* Esta funcao vai procurar o ultimo nome */

ultimoNome(s1,s2);

/* Esta função vai procurar os outros nomes*/

tmp = strlen(s2);

primeiroNome(s1,s2,tmp);

for(h=0;s2[h] != '\0'; h++) {
printf("%c",s2[h]);
}

printf("\n");

return 0;
}

O unico problema que tenho é, ao introduzir o seguinte nome Joaquim da Costa Soares Silva, aparece o seguinte Silva Joaquim C S S (este ultimo S não devia aparecer visto que é o S do apelido)

Alguem tem alguma sugestão.

Agredeço desde ja a vossa ajuda

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No final apagas os últimos dois caracteres da string (isto quando o nome é composto por mais de 3 nomes, e podes meter uma flag no para detectar esta situação).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ja reparei que o administrador tem alterado os meus posts de forma a melhorar a apresentação dos mesmo, peço desculpa pelo trabalho que originei. Existe alguma forma de eu fazer essa organização na altura da criação do post?

Voltando ao problema, ja o resolvi (penso eu), bastou alterar o seguinte ciclo for (alterei a condição de teste)

for(h=0;s2[h] != '\0'; h++) {

printf("%c",s2[h]);

}

para

cs2 = strlen(s2);

for(u=0; u < (cs2-2); u++){

printf("%c",s2);

}

Agradeço mais uma vez a ajuda.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Usa a tag [ code] (sem espaço) quando colocares código.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora