Localhost 3 Denunciar mensagem Publicado 15 de Janeiro de 2010 Olá, já estive aqui a tentar descobrir mas, não percebo porque é que quando ele entra no loop para ir até ao final do ficheiro não sai do mesmo... #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char s_in[1000]; char s_out[1000]; char s_check[100]; char f_code[100]; char f_decode[100]; FILE *in; int i_cont=0,i_space=0,i_str=0,i_cont2=0,i_cont3=0; if(!(in=fopen("words.txt","r"))) { puts("Error opening file\n"); exit(1); } printf("What's the message: "); scanf("%s", s_in); while(s_in[i_cont]) { while(s_in[i_space] != ' ') { s_check[i_str] = s_in[i_space]; i_space++; i_str++; } while(!feof(in)) { fscanf(in,"%s",f_code); fscanf(in,"%s",f_decode); if(!(strcmp(f_code,s_check))) { while(f_decode[i_cont2] != '\0') { s_out[i_cont3] = f_decode[i_cont2]; i_cont2++; i_cont3++; } break; } } while(s_in[i_space] != ' ') { s_out[i_cont3] = s_check[i_space]; i_space++; i_cont3++; } } printf("%s\n", s_out); return(0); } Alguma ajuda? P.s. Este programa tem o intuito de "descodificar" mensagens escritas pela suposta geração de futuro portuguesa... here since 2009 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
TheDark 0 Denunciar mensagem Publicado 15 de Janeiro de 2010 Eu diria que é por nunca modificares o valor da variável i_cont. Desaparecido. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Localhost 3 Denunciar mensagem Publicado 15 de Janeiro de 2010 Que erro estupido, até tenho vergonha de o ter mostrado. Obrigado, o programa já está operacional. Já agora para quem quiser isto para perceber as mensagens dos filhos (a geração perdida) fica aqui o programa e uma pequena lista de palavras: #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char s_in[1000]; char s_out[1000]; char s_check[100]; char f_code[100]; char f_decode[100]; FILE *in; int i_cont=0,i_space=0,i_str=0,i_cont2=0,i_cont3=0; if(!(in=fopen("words.txt","r"))) { puts("Error opening file\n"); exit(1); } printf("What's the message: "); scanf("%s", s_in); while(s_in[i_cont]) { while(s_in[i_space] != ' ') { s_check[i_str] = s_in[i_space]; i_space++; i_str++; } while(!feof(in)) { fscanf(in,"%s",f_code); fscanf(in,"%s",f_decode); if(!(strcmp(f_code,s_check))) { while(f_decode[i_cont2] != '\0') { s_out[i_cont3] = f_decode[i_cont2]; i_cont2++; i_cont3++; } break; } } while(s_in[i_space] != ' ') { s_out[i_cont3] = s_check[i_space]; i_space++; i_cont3++; } i_cont++; } printf("%s\n", s_out); return(0); } olah ola k que windu lindo u o axx assinado meninuh menino exkola escola A lista de palavras é pequena eu sei, quem quiser aumentar que o faça e que a poste aqui... here since 2009 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
vasco16 0 Denunciar mensagem Publicado 15 de Janeiro de 2010 Eu diria que é por nunca modificares o valor da variável i_cont. Exactamente, estas sempre na posição 0. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Localhost 3 Denunciar mensagem Publicado 15 de Janeiro de 2010 Já modifiquei, agora estou só a corrigir alguns bugs que encontrei... here since 2009 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Localhost 3 Denunciar mensagem Publicado 15 de Janeiro de 2010 Só uma coisa: Aquele break vai fazer com que quebre qual laço? here since 2009 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
vasco16 0 Denunciar mensagem Publicado 15 de Janeiro de 2010 Só uma coisa: Aquele break vai fazer com que quebre qual laço? Não tenho a certeza mas penso que quebre isto: while(s_in[i_space] != ' ') { s_out[i_cont3] = s_check[i_space]; i_space++; i_cont3++; } i_cont++; } Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Localhost 3 Denunciar mensagem Publicado 15 de Janeiro de 2010 Não, agora é que vi, ele quebra o while de busca no ficheiro. Eu estou agora a ter aqui alguns problemas, alguém podia ver? #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char s_in[1000]; char s_out[1000]; char s_check[100]; char f_code[100]; char f_decode[100]; FILE *in; int i_cont=0,i_space=0,i_str=0,i_cont2=0,i_cont3=0,i_cont4=0; if(!(in=fopen("words.txt","r"))) { puts("Error opening file\n"); exit(1); } printf("What's the message: "); scanf("%s", s_in); while(s_in[i_cont] != '\0') { while(s_in[i_space] != ' ') { s_check[i_str] = s_in[i_space]; i_space++; i_str++; } printf("%s\n", s_check); while(!feof(in)) { fscanf(in,"%s",f_code); fscanf(in,"%s",f_decode); if(!(strcmp(f_code,s_check))) { while(f_decode[i_cont2] != '\0') { s_out[i_cont3] = f_decode[i_cont2]; i_cont2++; i_cont3++; } break; } } while(s_check[i_cont4] != '\0') { s_out[i_cont3] = s_check[i_cont4]; i_cont4++; i_cont3++; } i_cont++; } printf("%s\n", s_out); return(0); } here since 2009 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
vasco16 0 Denunciar mensagem Publicado 15 de Janeiro de 2010 Não, agora é que vi, ele quebra o while de busca no ficheiro. Eu estou agora a ter aqui alguns problemas, alguém podia ver? #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char s_in[1000]; char s_out[1000]; char s_check[100]; char f_code[100]; char f_decode[100]; FILE *in; int i_cont=0,i_space=0,i_str=0,i_cont2=0,i_cont3=0,i_cont4=0; if(!(in=fopen("words.txt","r"))) { puts("Error opening file\n"); exit(1); } printf("What's the message: "); scanf("%s", s_in); while(s_in[i_cont] != '\0') { while(s_in[i_space] != ' ') { s_check[i_str] = s_in[i_space]; i_space++; i_str++; } printf("%s\n", s_check); while(!feof(in)) { fscanf(in,"%s",f_code); fscanf(in,"%s",f_decode); if(!(strcmp(f_code,s_check))) { while(f_decode[i_cont2] != '\0') { s_out[i_cont3] = f_decode[i_cont2]; i_cont2++; i_cont3++; } break; } } while(s_check[i_cont4] != '\0') { s_out[i_cont3] = s_check[i_cont4]; i_cont4++; i_cont3++; } i_cont++; } printf("%s\n", s_out); return(0); } Tenta não usar os ciclos encadeados. Faz uma operação de cada vez: 1º ler ficheiro: 2º fazer descodificação x; 3º fazer descodificação y; Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
TheDark 0 Denunciar mensagem Publicado 15 de Janeiro de 2010 A instrução break quebra sempre o ciclo mais próximo. No caso, como concluíste, era o while(!feof(in)) Desaparecido. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Localhost 3 Denunciar mensagem Publicado 15 de Janeiro de 2010 Tenho de usar neste caso porque tenho de ler do ficheiro, comparar e adicionar à string tudo num só loop que é enquanto a string que recebe a mensagem for diferente de \0 senão não dava mas se tiveres alguma sugestão para fazer o que disseste com um exemplo concreto agradeço... here since 2009 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites