Logo Hardware.com.br
PauloFireMaster
PauloFireMas... Membro Senior Registrado
160 Mensagens 2 Curtidas

Linguagem C: Programa trava na execução, como resolver?

#1 Por PauloFireMas... 09/05/2012 - 00:53
Ultimamente tenho percebido que alguns programas que eu crio em C, trava na execução, o código compila normalmente, não aparece nenhum erro de sintaxe mas na hora de executar o programa já compilado aparece aquele erro chato do Windows "O programa tal.exe parou de funcionar, procurando solução e blá blá blá"

Vou deixar aqui o código fonte de um destes programas simples que eu criei e queria que vocês me explicassem, qual é causa deste problema.

Observação:

Utilizo o Dev-C++ e o CodeBlocks.
Utilizo o Windows 7 64bits

O código-fonte de um programa que não executa abaixo:


#include <stdio.h>
#include <stdlib.h>

int main()

{
int cpf ;
int contador ;


do
{
printf("Digite o CPF: &quot ;
gets(cpf) ;

contador = strlen(cpf) ;

} while(contador == 11) ;


system("pause&quot ;
return 0 ;
}

O que vocês acham, tem algum erro que impede o programa de executar mesmo ele compilando normalmente sem nenhum erro de sintaxe?

Agradeço quem puder me ajudar
Responder
Henry-Keys
Henry-Keys Geek Registrado
1.8K Mensagens 235 Curtidas
#2 Por Henry-Keys
09/05/2012 - 01:31
PauloFireMaster disse:
Ultimamente tenho percebido que alguns programas que eu crio em C, trava na execução, o código compila normalmente, não aparece nenhum erro de sintaxe mas na hora de executar o programa já compilado aparece aquele erro chato do Windows "O programa tal.exe parou de funcionar, procurando solução e blá blá blá"

Vou deixar aqui o código fonte de um destes programas simples que eu criei e queria que vocês me explicassem, qual é causa deste problema.

Observação:

Utilizo o Dev-C++ e o CodeBlocks.
Utilizo o Windows 7 64bits

O código-fonte de um programa que não executa abaixo:


#include <stdio.h>
#include <stdlib.h>

int main()

{
int cpf ;
int contador ;


do
{
printf("Digite o CPF: &quot ;
gets(cpf) ;

contador = strlen(cpf) ;

} while(contador == 11) ;


system("pause&quot ;
return 0 ;
}

O que vocês acham, tem algum erro que impede o programa de executar mesmo ele compilando normalmente sem nenhum erro de sintaxe?

Agradeço quem puder me ajudar


Isso está travando porque a função "gets()", lê strings e não integers.

"int" cpf;
gets(cpf); //Erro grave

O que correcto seria:

int cpf
scanf("%i",&cpf);

Ahhh, quase me esquecia, strlen é uma função destinada para strings também, ela retorna o comprimento de uma string. Ex:

char str[12];
int compr;

compr=strlen(str); //compr recebe o comprimento de str

Legal??
PauloFireMaster
PauloFireMas... Membro Senior Registrado
160 Mensagens 2 Curtidas
#3 Por PauloFireMas...
09/05/2012 - 13:33
Henry-Keys disse:
Isso está travando porque a função "gets()", lê strings e não integers.

"int" cpf;
gets(cpf); //Erro grave

O que correcto seria:

int cpf
scanf("%i",&cpf);

Ahhh, quase me esquecia, strlen é uma função destinada para strings também, ela retorna o comprimento de uma string. Ex:

char str[12];
int compr;

compr=strlen(str); //compr recebe o comprimento de str

Legal??



Parceiro, já segui suas recomendações e continua dando erro, olha aqui:


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

int main()

{
char cpf ;
int contador ;


do
{
printf("Digite o CPF: &quot ;
gets(cpf) ;

contador = strlen(cpf) ;

} while(contador == 11) ;


system("pause&quot ;
return 0 ;
}



E agora?
As pessoas loucas o bastante para acreditar que podem mudar o mundo, são as que o mudam.
Henry-Keys
Henry-Keys Geek Registrado
1.8K Mensagens 235 Curtidas
#4 Por Henry-Keys
09/05/2012 - 13:40
PauloFireMaster disse:
Parceiro, já segui suas recomendações e continua dando erro, olha aqui:


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

int main()

{
char cpf ;
int contador ;


do
{
printf("Digite o CPF: &quot ;
gets(cpf) ;

contador = strlen(cpf) ;

} while(contador == 11) ;


system("pause&quot ;
return 0 ;
}



E agora?


Olá amigo.

Deu errado outra vez porque cpf não é uma string é uma char (carácter único), entenda algo!! strlen e gets só servem para strings não para chars.

String é na verdade um vetor de caracteres, declarado assim:
char nome_var [tamanho] //Isso é uma string

char cpf; //
gets(cpf); //Está errado porque cpf não é uma string

Além disso, cpf não deveria ser um inteiro??

Qual o seu objectivo nesse programa??
t3sting
t3sting Super Participante Registrado
717 Mensagens 38 Curtidas
#5 Por t3sting
09/05/2012 - 13:51

#include <stdio.h>
#include <stdlib.h>

int main()

{
int cpf ;
int contador ;


do
{
printf("Digite o CPF: &quot ;
gets(cpf) ;

contador = strlen(cpf) ;

} while(contador == 11) ;


system("pause&quot ;
return 0 ;
}

E ae cara blz? Bom se a ideia do programa é verificar se o usuário digitou corretamente o CPF, acredito que essa não é uma maneira apropriada para realizar essa tarefa. Conforme já foi solicitado, qual é a real finalidade deste programa?
A lógica e a razão não salvam.!

http://omundoeh.blogspot.com
PauloFireMaster
PauloFireMas... Membro Senior Registrado
160 Mensagens 2 Curtidas
#6 Por PauloFireMas...
09/05/2012 - 14:50
Henry-Keys disse:
Olá amigo.

Deu errado outra vez porque cpf não é uma string é uma char (carácter único), entenda algo!! strlen e gets só servem para strings não para chars.

String é na verdade um vetor de caracteres, declarado assim:
char nome_var [tamanho] //Isso é uma string

char cpf; //
gets(cpf); //Está errado porque cpf não é uma string

Além disso, cpf não deveria ser um inteiro??

Qual o seu objectivo nesse programa??

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

int main()

{
char cpf[11] ;
int contador ;


do
{
printf("Digite o CPF: &quot ;
gets(cpf) ;

contador = strlen(cpf) ;

} while(contador == 11) ;


system("pause&quot ;
return 0 ;
}


Agora o programa não deu mais erro, mas aconteceu algo pior, não está realizando o laço de repetição Do..While que eu quero

O objetivo deste programa até o momento é: Pedir o usuário o número de CPF dele, se o número for maior ou menor que 11, vai ter que continuar pedindo, até o usuário digitar um número de 11 dígitos.

Além disso, como mais tarde eu vou ter que manipular estes dados, o ideal seria que o cpf fosse do tipo inteiro.

Sacou?

Grande abraço
As pessoas loucas o bastante para acreditar que podem mudar o mundo, são as que o mudam.
t3sting
t3sting Super Participante Registrado
717 Mensagens 38 Curtidas
#7 Por t3sting
09/05/2012 - 15:03
PauloFireMaster disse:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()

{
char cpf[11] ;
int contador ;


do
{
printf("Digite o CPF: &quot ;
gets(cpf) ;

contador = strlen(cpf) ;

} while(contador == 11) ;


system("pause&quot ;
return 0 ;
}
Agora o programa não deu mais erro, mas aconteceu algo pior, não está realizando o laço de repetição Do..While que eu quero

O objetivo deste programa até o momento é: Pedir o usuário o número de CPF dele, se o número for maior ou menor que 11, vai ter que continuar pedindo, até o usuário digitar um número de 11 dígitos.

Além disso, como mais tarde eu vou ter que manipular estes dados, o ideal seria que o cpf fosse do tipo inteiro.

Sacou?

Grande abraço

Manero, mas se a ideia for executar o laço se o número for diferente de 11, a lógica está incorreta no seu do..while.
Seria mais ou menos assim:

do
{
printf("Digite o CPF: &quot;
gets(cpf);

contador = strlen(cpf);
}while(contado ! = 11);


Mas mesmo assim o laço seria executado somente a primeira vez, porque o tamanho da sua string é 11.
A lógica e a razão não salvam.!

http://omundoeh.blogspot.com
Henry-Keys
Henry-Keys Geek Registrado
1.8K Mensagens 235 Curtidas
#8 Por Henry-Keys
09/05/2012 - 15:05
PauloFireMaster disse:


Agora o programa não deu mais erro, mas aconteceu algo pior, não está realizando o laço de repetição Do..While que eu quero

O objetivo deste programa até o momento é: Pedir o usuário o número de CPF dele, se o número for maior ou menor que 11, vai ter que continuar pedindo, até o usuário digitar um número de 11 dígitos.

Além disso, como mais tarde eu vou ter que manipular estes dados, o ideal seria que o cpf fosse do tipo inteiro.

Sacou?

Grande abraço


OK, entendi. Então CPF vai ter de ser uma string de tamanho 11!!, ou seja de 0 a 11 são doze elementos no vetor, o último elemento é reservado para o terminador de string, certo??
[code=rich]
#include
#include
#include

int main(){
char cpf[11]; //String de tamanho 12,
//ou seja de 0 a 11 última posição reservado para \0

int i=0; //Tamanho da string digitada será guardada nessa variável

printf("Digite seu CPF\n");
gets (cpf); //Valor digitado será armazenado na string cpf

i=strlen(cpf); //i irá receber o tamanho do valor digitado

if(i!=11){ //Se i for diferente de 11, ou seja se a string digitada
//não tiver 11 elementos então iremos chamar main();

printf("CPF invalido, digite denovo\n");
//Mensagem de erro gerada porque cpf não tem 11 caracteres

main(); //Reinicia o programa saltando para a função principal
}

//Caso CPF tiver 11 caracteres então

printf("CPF valido de numero: %s\n",cpf); //Imprime o valor da string cpf
system("pause"); //Chamada do cmd que coloca programa em pausa
return (0); //Termina o programa retornando 0 para main()
}
[/code]

Obs: seu loop não dá certo, porque se CPF conter 11 caracteres então o loop vai se repetir,
que é o contrário do que você está pretendendo fazer.

Abraços.
PauloFireMaster
PauloFireMas... Membro Senior Registrado
160 Mensagens 2 Curtidas
#9 Por PauloFireMas...
09/05/2012 - 15:24
Henry-Keys disse:
OK, entendi. Então CPF vai ter de ser uma string de tamanho 12!!, ou seja de 0 a 11 são doze elementos no vetor, o último elemento é reservado para o terminador de string, certo??

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

int main(){
char cpf[12]; //String de tamanho 12, ou seja de 0 a 11 última posição reservado para \0
int i=0; //Tamanho da string digitada será guardada nessa variável

printf("Digite seu CPF\n&quot;
gets (cpf); //Valor digitado será armazenado na string cpf
i=strlen(cpf); //i irá receber o tamanho do valor digitado
if(i!=11){ //Se for diferente de 11, ou seja se não tiver 11 elementos então iremos chamar main();
printf("CPF invalido, digite denovo\n&quot;
main();
}
printf("CPF valido de numero: %s\n",cpf); //Imprime o valor da string cpf
system("pause&quot; //Chamada do cmd que coloca programa em pausa
return (0);
}



Parceiro, agora funfou, muito obrigado! aquele abraço! smile.png
As pessoas loucas o bastante para acreditar que podem mudar o mundo, são as que o mudam.
Responder Tópico
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal