Logo Hardware.com.br
intruso
intruso Tô em todas Registrado
1.8K Mensagens 41 Curtidas

qual o erro neste codigo fonte?

#1 Por intruso 24/02/2005 - 15:20
eu fiz este programa para armazenar as linhas digitadas no shell e imprimir só as linhas que passarem de certo número de caracteres...

eu digito as linhas ... mas depois que finalizo o programa ele não imprime, fica parado como se em loop infinito...

deem uma olhada no código:


/*imprime linhas que tem mais que 80 caracteres*/
#include

#define LIMITE 5000
#define TAMANHO 80
#define MAX_LINHA 1000

int lelinha(int entrada[], int tamanho_max);

void copia(int de[], int para[], int posicao_atual);


int main()
{
int estouro, tam, temp;
int texto[LIMITE];
int linha[MAX_LINHA];

tam=estouro=0;

while((tam=lelinha(linha, MAX_LINHA)) > 0)
{
if(tam > TAMANHO)
{
copia(linha,texto,estouro);
}
estouro+=tam;
}

/* imprime linhas armazenadas*/

printf("%s", texto);

return 0;
}

/*funcoes usadas no programa*/

/*le ultima linha da entrada com tamanho predefinido para limite e
retorna tamanho da linha*/

int lelinha(int entrada[], int valor)
{

int c, i;

for(i=0; i entrada[i]=c;

if(c=='\n') entrada[i]='\n';
i++;
entrada[i]='\0';

return i;

}

//copia uma string para outra, na posi‡Æo especificada, presume que destino ‚ grande o suficiente

void copia(int de[], int para[], int posicao)
{
int i=0;

for(i=0; de[i]!='\0'; ++i)
{
para[posicao]=de[i];
++posicao;
}

++posicao;
para[posicao]='\0';

}

___________________________________

aguardo soluções, t+
jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#2 Por jqueiroz
24/02/2005 - 16:34
Se você vai ler caracteres, pra montar strings, a função lelinha() tem que receber como parâmetros um array de caracteres.

Assim, mude todos os seus "int array[]" para "char array[]".

Outra coisa, tem um erro no trecho "if (c=='\n') ... i++;". Você está incrementando o contador "i" incondicionalmente... era isso que você queria?

PS: Quando for postar um código, use os tags [ code ] e [ /code ] para manter a indentação.
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
intruso
intruso Tô em todas Registrado
1.8K Mensagens 41 Curtidas
#3 Por intruso
24/02/2005 - 16:49
no trecho referido eu realmente queria incrementar o i, para passar para a proxima posição onde eu ia armazenar o final da string.

eu ja tinha tentado modificar os tipos de array para char, mas eu acho que não tinha problema, pois os chars só são inteiros menores e usando int eu poderia armazenar no vetor caracteres de outros tipos que não podem ser armazenados em char, como o "EOF".


fora isso, modificações feitas:



/*imprime linhas que tem mais que 80 caracteres*/
#include <stdio.h>

#define LIMITE 5000
#define TAMANHO 80
#define MAX_LINHA 1000

int lelinha(char entrada[], int tamanho_max);

void copia(char de[], char para[], int posicao_atual);


int main()
{
int estouro, tam, temp;
char texto[LIMITE];
char linha[MAX_LINHA];

tam=estouro=0;

while((tam=lelinha(linha, MAX_LINHA)) > 0)
{
if(tam > TAMANHO)
{
copia(linha,texto,estouro);
}
estouro+=tam;
}

/* imprime linhas armazenadas*/

printf("%s", texto);

return 0;
}

/*funcoes usadas no programa*/

/*le ultima linha da entrada com tamanho predefinido para limite e
retorna tamanho da linha*/

int lelinha(char entrada[], int valor)
{

int c, i;

for(i=0; i<valor-1 && (c=getchar())!=EOF && c!='\n';++i)
entrada[i]=c;

if(c=='\n') entrada[i]='\n';
i++;
entrada[i]='\0';

return i;

}

//copia uma string para outra, na posi‡Æo especificada, presume que destino ‚ grande o suficiente

void copia(char de[], char para[], int posicao)
{
int i=0;

for(i=0; de[i]!='\0'; ++i)
{
para[posicao]=de[i];
++posicao;
}

++posicao;
para[posicao]='\0';

}



continua com o mesmo erro, acho que é algum erro de lógica.

t+
intruso
intruso Tô em todas Registrado
1.8K Mensagens 41 Curtidas
#6 Por intruso
24/02/2005 - 17:46
encontrei um erro!!!


int lelinha(char entrada[], int valor)
{

int c, i;

for(i=0; i< (valor-1) && (c=getchar())!=EOF && c!='\n';++i)
entrada[i]=c;

if(c=='\n') entrada[i]='\n';
i++;
entrada[i]='\0';

if(c==EOF) return 0;

else return i;

}



a função não retornava o zero quando encontrava fim de arquivo e entrava em loop infinito. adicionei um condicional para verificar se o caracter digitado era EOF e para retornar zero.

deu certo, em partes, agora o programa não imprime a string que contem as frases armazenadas :-( ...

vou verificar se encontro mais alguma coisa... espero sugestões.

t+


t+
intruso
intruso Tô em todas Registrado
1.8K Mensagens 41 Curtidas
#7 Por intruso
24/02/2005 - 18:09
feito!!! achei os erros, eu não tinha zerado os vetores e por isso eles continham lixo!!

tambem adicionei uma condicional para verificar se o espaço alocado para as linhas acabou.

só isso... :O

código:



/*imprime linhas com mais de 80 caracteres*/
#include <stdio.h>

#define LIMITE 5000
#define TAMANHO 80
#define MAX_LINHA 1000

int lelinha(char entrada[], int tamanho_max);

void copia(char de[], char para[], int posicao_atual);


int main()
{
int estouro, tam, i;
char texto[LIMITE];
char linha[MAX_LINHA];

tam=estouro=i=0;

//zera vetores
for(i=0; i<LIMITE;++i)
texto[i]=0;

for(i=0; i<MAX_LINHA; ++i)
linha[i]=0;

// loop principal

while((tam=lelinha(linha, MAX_LINHA)) > 0 && estouro < (LIMITE-1))
{
if(tam > TAMANHO)
{
copia(linha,texto,estouro);
estouro+= tam;
}

}

/* imprime linhas armazenadas*/

if (estouro > 0)
{
printf("%s", texto);

}
return 0;
}

/*funcoes usadas no programa*/

/*le ultima linha da entrada com tamanho predefinido para limite e
retorna tamanho da linha*/

int lelinha(char entrada[], int valor)
{

int c, i;

for(i=0; i< (valor-1) && (c=getchar())!=EOF && c!='\n';++i)
entrada[i]=c;

if(c=='\n') entrada[i]='\n';
i++;
entrada[i]='\0';

if(c==EOF) return 0;

else return i;

}

//copia uma string para outra, na posi‡Æo especificada, presume que destino ‚ grande o suficiente

void copia(char de[], char para[], int posicao)
{
int i=0;

for(i=0; de[i]!='\0'; ++i)
{
para[posicao]=de[i];
++posicao;
}

++posicao;
para[posicao]='\0';

}




edit.: bug encontrado, mas ja fiz a correção!

t+
jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#8 Por jqueiroz
24/02/2005 - 18:26
Não era isso não... eu não quis postar a correção pra fazer vc se esforçar um pouco mais :lol: :

Função lelinha() :

(...)
if(c=='\n') entrada[i]='\n';
i++;
entrada[i]='\0';

return i;
(...)


Aqui, o i vai ser sempre incrementado, então ele nunca vai retornar igual a zero (que é a sua condição de fim do loop).

A solução mais simples é:


(...)
if(c=='\n')
{
entrada[i]='\n';
i++;
}
entrada[i]='\0';

return i;
(...)


Agora o i só vai ser incrementado se o último caracter digitado foi "\n", que precisa ser inserido no texto.
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
intruso
intruso Tô em todas Registrado
1.8K Mensagens 41 Curtidas
#9 Por intruso
24/02/2005 - 18:36
eu não me expressei bem ... na verdade eu queria que o i sempre fosse incrementado.

pois no teste principal da função se o "c" fosse igual a '\n' o i não era incrementado e o caracter não era adicionado ao vetor, mas, eu precisava do caracter dentro do vetor, então coloquei o condicional para adicionar o '\n' caso necessário. mas ai eu não tinha colocado o sinal de fim de vetor ( "\0" ) e se eu não incrementasse o i iria substituir algum caracter, ai eu incrementei o i para poder adicionar o '\0' independente de qual fosse o caracter digitado.

mas, eu dei uma lida nos trechos e entendi o que vc quiz dizer vc tava certo ... nunca vi tanto bug num programa só.. parece uma empresa bem conhecida... 8)


" jqueiroz ... esforçar mais ..." :cry: eu passei a tarde nesse programinha.... :evil:



valeu t+
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal