Jump to content

Apontadores e strings


Go to solution Solved by SpecialOne,

Recommended Posts

Posted

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,

Posted

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...

Posted

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

  • Solution
Posted

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.

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.