Pular para o conteúdo

Teste de Caracter... [RESOLVIDO]

Responder tópico
  • Denunciar
  • Indicar

1. Teste de Caracter... [RESOLVIDO]

Enviado em 31/05/2010 - 15:54h

Boa tarde pessoal...

Estou tendo um problema para fazer o tratamento de erros de um exercício da faculdade.

Preciso impedir que caracteres sejam digitados em campos inteiros ou real.

Pensei em usar isdigit da ctype.h. mas não tenho muito conhecimento sobre o seu uso.

Se alguem puder me dizer o que está errado nessa parte do código eu agradeço.

#include <stdio.h>

#include <stdlib.h>
#include <ctype.h>

int main()

{

int quant_prod;




do

{

do
{
system("clear");

printf(" || Controle de Estoque ||\n\n");

printf("Digite a quantidade de produtos a ser cadastrado:\n");
scanf("%d", &quant_prod);
if (isdigit(quant_prod))
{
printf("Apenas numeros podem ser digitados.\n");
printf("Precione <ENTER> para continuar.\n");
system("read b");
}
if (quant_prod <= 0)
{
printf("Opcao Invalida...\n");
printf("Digite um numero maior que 0.\n");
printf("Precione <ENTER> para continuar.\n");
system("read b");
}
} while (quant_prod < 1 || isdigit(quant_prod));
}
}

O erro que aparece é: "Falha de Segmentação" e o programa é encerrado.

Antes, tinha tentado o mesmo código com !isdigit(quant_prod), pois imaginei que essa função retornasse verdadeiro quando o campo fosse numérico.
Mas o programa assionava o primeiro if sempre que um número éra digitado e depois dava problema.

Ao incluir essa biblioteca, não é necessário acrescentar nada a compilação, correto???
gcc main.c -o controle

Agradeço muito qualquer ajuda que possa ser oferecida.

Muito obrigado.

Responder tópico

2. Re: Teste de Caracter... [RESOLVIDO]

Melhor resposta

Enviado em 01/06/2010 - 04:34h

Esse código que eu fiz só aceita números. Trata a entrada como um caracter, inserindo-o em uma string de um caracter para que seja usada a função atoi().

Já ajuda?

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

int main(void){

char sQtd[2];
int iQtd;

sQtd[1] = '\0';

scanf("%c", &sQtd[0]);
if(sQtd[0] < '0' || sQtd[0] > '9'){
printf("SOMENTE NUMEROS(sQtd=%c)\n", sQtd[0]);
sQtd[0] = '\0';
}
else{
iQtd = atoi(sQtd);
printf("NUMERO EH: %d\n", iQtd);
}

return 0;
}

3. Re: Teste de Caracter... [RESOLVIDO]

Enviado em 31/05/2010 - 22:20h

Se for o que eu estou pensando, você pode usar a função atoi().

4. Re: Teste de Caracter... [RESOLVIDO]

Enviado em 01/06/2010 - 04:36h

deu algum erro na msg, onde está 'deu algum erro na msg, onde está 'Muito obrigado pela ajuda gente...

Ontem não pude mais acessar a internet e depois de horas quebrando a cabeça, acabei montando uma function para resolver o problema (como ccarrara mencionol, e utilizando o atoi() e atof()).

Mas mesmo assim agradeço muito pela ajuda de vocês.

E apesar de eu não ser muito bom em C, se eu puder ajudar, podem contar comigo.

Segue as duas funções (para int e float):

#include <stdio.h>

#include <stdlib.h>

#include <string.h>





float teste_float()

{

char a[20];

int i, sair, cont;

float result;



do

{
cont = 0;

sair = 0;

i = 0;

scanf("%s", a);

do

{
if (a[i] == 46)
{
cont++;
}
if (cont == 2)
{
printf("\nO .(ponto) so deve ser utilizado uma vez, na separacao das casas decimais.\n");
printf("Precione <ENTER> para continuar.\n");
system("read b");
system("clear");
printf("Digite novamente:\n");
sair = 1;
}

if ((a[i] != 46 && a[0] != 45) && (a[i] < 48 || a[i] > 57))

{

printf("\nNao digite caracteres dentro do campo numerico.\n");

printf("Precione <ENTER> para continuar\n");

system("read b");

system("clear");

printf("Digite novamente:\n");

sair = 1;

}

i++;

} while (i < strlen(a) && sair != 1);

} while (sair != 0);

result = atof(a);

return result;

}







int teste_int()

{

char a[20];

int i, sair, result;



do

{

sair = 0;

i = 0;

scanf("%s", a);

do

{

if ((a[0] != 45) && (a[i] < 48 || a[i] > 57))

{

printf("\nNao digite caracteres dentro do campo numerico.\n");

printf("Precione <ENTER> para continuar\n");

system("read b");

system("clear");

printf("Digite novamente:\n");

sair = 1;

}

i++;

} while (i < strlen(a) && sair != 1);

} while (sair != 0);

result = atoi(a);

return result;

}


Essas funções já resolveram meu problema.

Mais uma vez, muito obrigado aos que se preocuparam.

' na verdade é o char de fim de string '\.0' (sem o ponto)
' na verdade é o char de fim de string '\.0' (sem o ponto)

5. Re: Teste de Caracter... [RESOLVIDO]

Enviado em 01/06/2010 - 12:14h

Muito obrigado pela ajuda gente...

Ontem não pude mais acessar a internet e depois de horas quebrando a cabeça, acabei montando uma function para resolver o problema (como ccarrara mencionol, e utilizando o atoi() e atof()).

Mas mesmo assim agradeço muito pela ajuda de vocês.

E apesar de eu não ser muito bom em C, se eu puder ajudar, podem contar comigo.

Segue as duas funções (para int e float):

#include <stdio.h>

#include <stdlib.h>

#include <string.h>





float teste_float()

{

char a[20];

int i, sair, cont;

float result;



do

{
cont = 0;

sair = 0;

i = 0;

scanf("%s", a);

do

{
if (a[i] == 46)
{
cont++;
}
if (cont == 2)
{
printf("\nO .(ponto) so deve ser utilizado uma vez, na separacao das casas decimais.\n");
printf("Precione <ENTER> para continuar.\n");
system("read b");
system("clear");
printf("Digite novamente:\n");
sair = 1;
}

if ((a[i] != 46 && a[0] != 45) && (a[i] < 48 || a[i] > 57))

{

printf("\nNao digite caracteres dentro do campo numerico.\n");

printf("Precione <ENTER> para continuar\n");

system("read b");

system("clear");

printf("Digite novamente:\n");

sair = 1;

}

i++;

} while (i < strlen(a) && sair != 1);

} while (sair != 0);

result = atof(a);

return result;

}







int teste_int()

{

char a[20];

int i, sair, result;



do

{

sair = 0;

i = 0;

scanf("%s", a);

do

{

if ((a[0] != 45) && (a[i] < 48 || a[i] > 57))

{

printf("\nNao digite caracteres dentro do campo numerico.\n");

printf("Precione <ENTER> para continuar\n");

system("read b");

system("clear");

printf("Digite novamente:\n");

sair = 1;

}

i++;

} while (i < strlen(a) && sair != 1);

} while (sair != 0);

result = atoi(a);

return result;

}


Essas funções já resolveram meu problema.

Mais uma vez, muito obrigado aos que se preocuparam.

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder