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: " ;
gets(cpf) ;
contador = strlen(cpf) ;
} while(contador == 11) ;
system("pause" ;
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
- Home
- >
- Fórum
- >
- Profissional
- >
- Programação, Sc...
- >
- Linguagem C: Programa tra...
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: " ;
gets(cpf) ;
contador = strlen(cpf) ;
} while(contador == 11) ;
system("pause" ;
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??
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: " ;
gets(cpf) ;
contador = strlen(cpf) ;
} while(contador == 11) ;
system("pause" ;
return 0 ;
}
E agora?
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: " ;
gets(cpf) ;
contador = strlen(cpf) ;
} while(contador == 11) ;
system("pause" ;
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??
#include <stdio.h>
#include <stdlib.h>
int main()
{
int cpf ;
int contador ;
do
{
printf("Digite o CPF: " ;
gets(cpf) ;
contador = strlen(cpf) ;
} while(contador == 11) ;
system("pause" ;
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?
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: " ;
gets(cpf) ;
contador = strlen(cpf) ;
} while(contador == 11) ;
system("pause" ;
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
PauloFireMaster disse: #include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char cpf[11] ;
int contador ;
do
{
printf("Digite o CPF: " ;
gets(cpf) ;
contador = strlen(cpf) ;
} while(contador == 11) ;
system("pause" ;
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: "
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.
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.
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"
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"
main();
}
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);
}
Parceiro, agora funfou, muito obrigado! aquele abraço!