Jump to content
Sign in to follow this  
nini10

STRTOK e gravar palavras

Recommended Posts

nini10

Boas amigos, tenho o seguinte problema.

Tenho de ler um string com o gets e no fim  ler as 2as primeiras palavras e guarda las em vars diferentes, e guardar o resto da string noutra string nova.

ou seja:

Str ="ola bruno esta tudo bem? "

Resultado:

str1 ="ola"

str2 ="bruno"

str3="esta tudo bem?"

o mais perto que andei foi isto

#include <string.h>

#include <stdio.h>

int main(){

char str[] = "ola bruno tudo bem?";

char delims[] = "#";

char *result = NULL;

char novo[100];

char novo2[100];

char novo3[100];

int i=0;

result = strtok( str, " " );

strcpy(novo,result);

while( result != NULL ) {

// printf( "result is \"%s\"\n", result );

result = strtok( NULL, " " );

if(i==0){

strcpy(novo2,result);

}

if(i==1){

result = strtok( NULL, " " );

strcpy(novo3,result);

}

i++;

}

printf("NOVO1: %s \n",novo);

printf("NOVO2: %s \n",novo2);

printf("NOVO3: %s \n",novo3);

}

OUT

Running…

NOVO1: ola

NOVO2: bruno

NOVO3: bem?

Agradeço a quem puder ajudar, pois é um pouco urgente

Share this post


Link to post
Share on other sites
nini10

Se tentar desta maneira tambem consigo tirar as duas primeiras palavras, mas o resto da frase nao faco ideia como sacar a seguir.

result = strtok( str, " " );

strcpy(novo,result);

result = strtok( NULL, " " );

strcpy(novo2,result);

Share this post


Link to post
Share on other sites
Baderous

Para obteres o resto da frase tens de calcular o índice do início do resto da frase. Supondo que aux1 é a 1ª string, aux2 é a 2ª string, então o início do resto da frase fica em str+strlen(aux1)+strlen(aux2)+2:

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

int main(void) {
        char str[] = "ola bruno tudo bem?";
        char *aux1, *aux2, *aux3;
        aux1=(char*)strdup(strtok(str," "));
        aux2=(char*)strdup(strtok(NULL," "));
        aux3 = (char*)strdup(str+strlen(aux1)+strlen(aux2)+2);
        printf("%s\n%s\n%s\n",aux1,aux2,aux3);
        return 0;
}

Share this post


Link to post
Share on other sites
nini10

Por que é que tens que usar a função gets para ler as strings? Quem é que te disse isso?

Vê aqui como usar a função strtok (tem um exemplo e tudo): http://www.cplusplus.com/reference/clibrary/cstring/strtok/.

Este excerto de codigo é para ser implementado num programa Cliente/servidor, o programa cliente vai estar sempre a ler uma string com o gets, se por acaso a primeira palavra for um comando, o cliente vai trabalhar de forma diferente do que se fosse apenas uma simples frase.

A forma como o strtok funciona ja percebi, nao percebi é como é que vou guardar em variaveis as duas primeiras palavras e o resto da frase noutra string.

Obrigado

Share this post


Link to post
Share on other sites
nini10

Para obteres o resto da frase tens de calcular o índice do início do resto da frase. Supondo que aux1 é a 1ª string, aux2 é a 2ª string, então o início do resto da frase fica em str+strlen(aux1)+strlen(aux2)+2:

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

int main(void) {
        char str[] = "ola bruno tudo bem?";
        char *aux1, *aux2, *aux3;
        aux1=(char*)strdup(strtok(str," "));
        aux2=(char*)strdup(strtok(NULL," "));
        aux3 = (char*)strdup(str+strlen(aux1)+strlen(aux2)+2);
        printf("%s\n%s\n%s\n",aux1,aux2,aux3);
        return 0;
}

Além de nao conhecer a função strdup, a verdade é que está  a funcionar perfeitamente.

Era mesmo isto que pretendia.

Desde já um muito obrigado a quem tentou ajudar.

Cumprimentos,

NINI10

Share this post


Link to post
Share on other sites
Baderous

A strdup faz um malloc seguido de um strcpy. O que é importante perceber é como se calcula o endereço de memória onde reside o início do resto da frase. É dado pelo endereço de str (que é o mesmo que str[0]) e a esse soma-se o comprimento das 2 strings já processadas, mais 2 (2 espaços). A aritmética de apontadores explica o resto.

Share this post


Link to post
Share on other sites
nini10

amigo, quando compilei o programa só como me mandas te estava a correr perfeitamente, quando encaixei esse código no resto do programar da me "FALHA DE SEGMENTAÇAO" e estoira logo o programa, alguma ideia?

NINI10

Share this post


Link to post
Share on other sites
Baderous

Sei lá, não sou adivinho para saber o que fizeste com o código. Mete aí como tens o código.

Share this post


Link to post
Share on other sites
nini10
if(logo==0){

printf("Tem de fazer login ( >login user pass).  \n ");

do{
printf("> ");
scanf("%s %s %s",cmdlogin,user,passe);	
}
while(strcmp(cmdlogin,"login")!=0);

strcpy(msg.login,user);
strcpy(msg.pass,passe);
msg.log=0;

sleep(1);

}
else{	

//ACTUALIZA NUM DE JOGADORES OLNI
updatenumuser();	

printf("> ");
gets(msg.texto);

msg.alluser=1;

//DIVIDIR STRING INSERIDA PELO UTILIZADOR
  //VARIAVEIS PARA SEPARAR STRING
char str[100];
char *aux1, *aux2, *aux3;
char pal1[20],pal2[20],pal3[50];

strcpy(str,msg.texto);

aux1=(char*)strdup(strtok(str," "));
aux2=(char*)strdup(strtok(NULL," "));
aux3 = (char*)strdup(str+strlen(aux1)+strlen(aux2)+2);

//strcpy(pal1,aux1);
//strcpy(pal2,aux2);
//strcpy(pal3,aux3);


printf("%s\n%s\n%s\n",pal1,pal2,pal3);








//SE O USER ESCRE WHO IMPRIME USERS ONLI
if(strcmp(msg.texto,"who")==0){
int n;
printf("Users online: ");
semop(semid, &operations_pedir, 1);
for(n=0;n<num_user_online;n++){	
printf("%s \t",valor_em_memoria[n].username);
}
semop(semid, &operations_libertar, 1);
printf("\n");
}


} //END ELSE




write(fd_servidor,&msg, sizeof(MSG));

Share this post


Link to post
Share on other sites
nini10

O meu problema está quando em vez de usar a string predefinida que ja esta escrita faco um gets a uma string e depois tento usa la como se fosse a que ja la está, dá me sempre erro de segmentação.

Estranho :/

Share this post


Link to post
Share on other sites
nini10

Boas,

else{

//ACTUALIZA NUM DE JOGADORES OLNI

updatenumuser();

char str[200];

//printf("> ");

//gets(str);

msg.alluser=1;

//strcpy(str,msg.texto);

//printf("STR: %s",str);

char *aux1, *aux2, *aux3;

char pal1[20],pal2[20],pal3[50];

printf("MSG: ");

fgets(str,sizeof(str),stdin);

aux1=(char*)strdup(strtok(str," "));

aux2=(char*)strdup(strtok(NULL," "));

aux3 = (char*)strdup(str+strlen(aux1)+strlen(aux2)+2);

strcpy(pal1,aux1);

strcpy(pal2,aux2);

strcpy(pal3,aux3);

printf("%s\n%s\n%s\n",pal1,pal2,pal3);

//SE O USER ESCRE WHO IMPRIME USERS ONLI

if(strcmp(msg.texto,"who")==0){

int n;

printf("Users online: ");

semop(semid, &operations_pedir, 1);

for(n=0;n<num_user_online;n++){

printf("%s \t",valor_em_memoria[n].username);

}

semop(semid, &operations_libertar, 1);

printf("\n");

}

} //END ELSE

Amigo ja tentei com fgets dá me sempre o mesmo resultado, está me a deixar doido isto :/

Bem Vindo!

Tem de fazer login ( >login user pass). 

> login nini10 nini10

Login Efectuado.

Segmentation fault

Share this post


Link to post
Share on other sites
Localhost

Mostra a parte do código depois da mensagem login efectuado e utiliza as tags code.


here since 2009

Share this post


Link to post
Share on other sites
nini10

void recebe_msg(int sinal){

fd_cliente = open(msg.remetente, O_RDONLY);
read(fd_cliente,&msg,sizeof(MSG));
close(fd_cliente);



if(logo==0){

int resposta;

resposta=msg.log;

//VERIFA SE O LOGIN ESTA CORRECTO

if(resposta==1){
logo=1;
printf("Login Efectuado. \n");
}
if(resposta==2){
logo=0;
printf("Password Errada. \n");
}
if(resposta==3){
logo=1;
printf("User Criado. Login Ok. \n");
}

}


}

Aqui esta a parte do login

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
Sign in to follow this  

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