SpecialOne Posted April 14, 2009 at 03:56 PM Report #256714 Posted April 14, 2009 at 03:56 PM 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,
Rui Carlos Posted April 14, 2009 at 04:05 PM Report #256718 Posted April 14, 2009 at 04:05 PM 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. Rui Carlos Gonçalves
KiNgPiTo Posted April 14, 2009 at 04:12 PM Report #256722 Posted April 14, 2009 at 04:12 PM 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...
SpecialOne Posted April 14, 2009 at 06:33 PM Author Report #256758 Posted April 14, 2009 at 06:33 PM 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
Rui Carlos Posted April 14, 2009 at 07:26 PM Report #256763 Posted April 14, 2009 at 07:26 PM 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). Rui Carlos Gonçalves
Solution SpecialOne Posted April 14, 2009 at 09:37 PM Author Solution Report #256788 Posted April 14, 2009 at 09:37 PM 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.
Rui Carlos Posted April 14, 2009 at 09:46 PM Report #256789 Posted April 14, 2009 at 09:46 PM Usa a tag [ code] (sem espaço) quando colocares código. Rui Carlos Gonçalves
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now