Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
Localhost

Dúvida relativamente a um loop

Recommended Posts

Localhost

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

Share this post


Link to post
Share on other sites
Localhost

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

Share this post


Link to post
Share on other sites
vasco16

Eu diria que é por nunca modificares o valor da variável i_cont.

Exactamente, estas sempre na posição 0.

Share this post


Link to post
Share on other sites
Localhost

Já modifiquei, agora estou só a corrigir alguns bugs que encontrei...


here since 2009

Share this post


Link to post
Share on other sites
vasco16

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++;
        }

Share this post


Link to post
Share on other sites
Localhost

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

Share this post


Link to post
Share on other sites
vasco16

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;

Share this post


Link to post
Share on other sites
TheDark

A instrução break quebra sempre o ciclo mais próximo. No caso, como concluíste, era o while(!feof(in))


Desaparecido.

Share this post


Link to post
Share on other sites
Localhost

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

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  

×

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.