Jump to content
Zzz

[Resolvido] Ajuda problema string

Recommended Posts

Zzz

Boas pessoal,

Tenho um pequeno problema para resolver e como ainda sou novo nisto tenho algumas dificuldades.

O que eu quero fazer é o seguinte, receber um nome de uma pessoa e depois imprimir com apelido, e o resto do nome mas sem apelido.

Pensei fazer o seguinte:

1º: Receber a string;

2:Saber o tamanho dela;

3:Fazer um for a começar do fim para saber onde esta o primeiro espaço, guardar a posição;

4: fazer um for do inicio do espaço ate ao fim;

5: fazer outro for do inicio ate ao espaço;

Penso que a solução passa por isto, como ainda estou no inicio deve ser das formas mais fáceis, a minha duvida estar a partir do ponto 4, como vou conseguir guardar a informação para depois imprimir correctamente.

Se alguém me poder ajudar agradecia.

Cumprimentos.

Share this post


Link to post
Share on other sites
HappyHippyHippo
funcao (param : string)
 - criar dois ponteiros
 - criar uma cópia da string para o primeiro ponteiro (processo destrutivo)
 - determinar a posição da última ocorrência de um espaço na string copiada (strrchr)
 - guardar a ocorrência no segundo ponteiro
 - determinar a posição da primeira ocorrência de um espaço na string copiada (strchr)
 - converter o caracter encontrado pelo valor zero (pode ser feito com o retorno da chamada anterior, logo não necessita de um terceiro ponteiro)
 - apresentar as duas strings apontada (sim ... são o primeiro e último nome)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Zzz

char string[TAM];
char nome[TAM];
unsigned short tamanho,count,i=0, j=0;
char space = ' ';

printf("inserir a frase: ");
fgets(string,TAM,stdin);

tamanho=strlen(string);

for(i=tamanho; i>0; i--){
    if(string[i]==' '){
        count=i;
    }
}

for(i=count;i<tamanho;i++){
    nome[j]=string[i];
    j++;
}

Para ja tenho isso, não esta completo, e não sei se é a forma mais correcta de o fazer.

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
thoga31

O @Happy referiu as funções que fazem isso sem teres de estar a fazê-lo manualmente.


Knowledge is free!

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu sei que não é o mais correcto, mas como estou um pouco aborrecido ... aqui tens 3 formas diferente de apresentar a primeira e a ultima palavra de uma frase/nome:

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

#define TAM 256

void proc1(char line[]) {
   char local[TAM];
   int pos1 = -1, pos2 = -1;
   int length = strlen(line);

   strcpy(local, line);

   for (pos1 = 0; local[pos1] != ' ' && pos1 < length; pos1++) /* void */;
   for (pos2 = length - 1; local[pos2] != ' ' && pos2 > 0; pos2--) /* void */;

   if (pos2 < pos1) {
       printf("(proc1) nao existe separacao possivel\n");
   } else {
       local[pos1] = 0;
       printf("(proc1) primeiro e ultimo : %s %s\n", local, &local[pos2 + 1]);
   }
}

void proc2(char line[]) {
   char local[TAM];
   char * line2 = NULL, * aux = NULL;

   strcpy(local, line);

   line2 = strrchr(local, ' ') + 1;
   aux = strchr(local, ' ');
   if (aux != NULL)  *aux = 0;

   if (line2 == NULL) {
       printf("(proc2) nao existe separacao possivel\n");
   } else {
       printf("(proc2) primeiro e ultimo : %s %s\n", local, line2);
   }
}

void proc3(char line[]) {
   char local[TAM];
   char * first = NULL, * last = NULL, * aux = NULL;

   strcpy(local, line);

   first = strtok(local, " ");
   while ((aux = strtok(NULL, " ")) != NULL) {
       last = aux;
   }

   if (last == NULL) {
       printf("(proc3) nao existe separacao possivel\n");
   } else {
       printf("(proc3) primeiro e ultimo : %s %s\n", first, last);
   }
}

int main(void) {
   char line[TAM];

   do {
       printf(">> insira o nome: ");
       fflush(stdout);
   } while (fgets(line, TAM, stdin) == NULL);

   if (line[strlen(line) - 1] == '\n')
       line[strlen(line) - 1] = 0;

   proc1(line);
   proc2(line);
   proc3(line);

   return 0;
}


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Zzz

eu sei que não é o mais correcto, mas como estou um pouco aborrecido ... aqui tens 3 formas diferente de apresentar a primeira e a ultima palavra de uma frase/nome:

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

#define TAM 256

void proc1(char line[]) {
char local[TAM];
int pos1 = -1, pos2 = -1;
int length = strlen(line);

strcpy(local, line);

for (pos1 = 0; local[pos1] != ' ' && pos1 < length; pos1++) /* void */;
for (pos2 = length - 1; local[pos2] != ' ' && pos2 > 0; pos2--) /* void */;

if (pos2 < pos1) {
	printf("(proc1) nao existe separacao possivel\n");
} else {
	local[pos1] = 0;
	printf("(proc1) primeiro e ultimo : %s %s\n", local, &local[pos2 + 1]);
}
}

void proc2(char line[]) {
char local[TAM];
char * line2 = NULL, * aux = NULL;

strcpy(local, line);

line2 = strrchr(local, ' ') + 1;
aux = strchr(local, ' ');
if (aux != NULL)  *aux = 0;

if (line2 == NULL) {
	printf("(proc2) nao existe separacao possivel\n");
} else {
	printf("(proc2) primeiro e ultimo : %s %s\n", local, line2);
}
}

void proc3(char line[]) {
char local[TAM];
char * first = NULL, * last = NULL, * aux = NULL;

strcpy(local, line);

first = strtok(local, " ");
while ((aux = strtok(NULL, " ")) != NULL) {
	last = aux;
}

if (last == NULL) {
	printf("(proc3) nao existe separacao possivel\n");
} else {
	printf("(proc3) primeiro e ultimo : %s %s\n", first, last);
}
}

int main(void) {
char line[TAM];

do {
	printf(">> insira o nome: ");
	fflush(stdout);
} while (fgets(line, TAM, stdin) == NULL);

if (line[strlen(line) - 1] == '\n')
	line[strlen(line) - 1] = 0;

proc1(line);
proc2(line);
proc3(line);

return 0;
}

Muito obrigado pela ajuda, consigo perceber o que as 3 funções fazem para chegar ao resultado final.

Mas como estava a fazer também é uma forma correcta ou existem erros que não devo cometer?

Share this post


Link to post
Share on other sites
HappyHippyHippo

Muito obrigado pela ajuda, consigo perceber o que as 3 funções fazem para chegar ao resultado final.

Mas como estava a fazer também é uma forma correcta ou existem erros que não devo cometer?

o que estavas a pretender fazer é a primeira forma no meu código


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

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.