Ir para o conteúdo
Zzz

[Resolvido] Ajuda problema string

Mensagens Recomendadas

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.