如何检查C语言中的数值?

时间:2011-10-13 17:30:25

标签: c numeric numerical

此问题之前已被问过,但我从来没有找到一个清晰简单的答案,所以我再问一遍......

我想知道,如果不使用除stdio.h之外的任何其他库,如何检查用户输入的是否是数字值。基本上,要求用户输入介于0和9之间的值。如果数字介于这两者之间,则会继续。例如,如果数字为12,则它会循环回到问题并再次询问该数字。

它工作正常,但如果我输入一个字母或十进制数字,它会进入无限循环......

基本上这是我的问题:如何检查输入的值是不是字符和非小数?

这是代码的开头:(对不起,它用法语,但你明白了......)

int main()
{

int nb1, nb2, rand_1, rand_2;
int nb_coups = 0;
int points = 0;

printf("\n\n                     ------ BIENVENUE A LA GRANDE ROUE ! ------\n\n");

do{
    //Saisie 1er nombre

    printf("Entrez le premier nombre choisi (entre 0 et 9) : ");
    scanf("%d",&nb1);

    //Tant que le 1er nombre n'est pas compri entre 0 et 9, on le redemande
        while(nb1<0 || nb1>9)
        {
            printf("Nombre incorrect. Entrez le premier nombre choisi (entre 0 et 9) : ");
            scanf("%d",&nb1);
        }
    //On affiche le 1er nombre
    printf("Le nombre choisi est : %d\n\n",nb1);

5 个答案:

答案 0 :(得分:3)

不要将scanf()用于控制台输入。相反,使用fgets()将stdin中的数据读入字符串然后解析,或者使用getchar()一次读取一个字符。如果你的环境包含这样的东西,你也可以考虑getch(),当支持它时,通常会读取一个打字字符而不等待之后的返回。

答案 1 :(得分:2)

使用fgets和sscanf:

char line [16];

fprintf(stderr, "Entrez le premier nombre choisi (entre 0 et 9) : ");
fgets (line, sizeof(line), stdin);
ret = sscanf(line,"%d",&nb1);

//Tant que le 1er nombre n'est pas compri entre 0 et 9, on le redemande
while((ret == 0) || (nb1 < 0) || (nb1 > 9)) {
    fprintf(stderr, "Nombre incorrect. Entrez le premier nombre choisi (entre 0 et 9) : ");
    fgets (line, sizeof(line), stdin);
    ret = sscanf(line,"%d",&nb1);
}

答案 2 :(得分:1)

您应该检查返回值以清除非数字。

printf("Entrez le premier nombre choisi (entre 0 et 9) : ");
ret = scanf("%d",&nb1);

//Tant que le 1er nombre n'est pas compri entre 0 et 9, on le redemande
    while(!ret && (nb1<0 || nb1>9))
    {
        char ch;
        while ((ch = getchar()) != '\n' && ch != EOF); // Flush the buffer
        printf("Nombre incorrect. Entrez le premier nombre choisi (entre 0 et 9) : ");
        ret = scanf("%d",&nb1);
    }

答案 3 :(得分:0)

不要使用scanf,自己进行解析。

char c;
int nb1 = 0;
while(1) {
    c = getchar();
    if(c > '0' && c < '9') {
        nb1 = nb1*10 + (c - '0'); // if you want numbers bigger than 9
    }
    else {
        break; // matches '\n', invalid chars and EOF
    }
}

瞧!

答案 4 :(得分:0)

我喜欢一般用途:

通用,具有一些溢出保护,并且如果您喜欢不同的范围,则允许一些通用性。

#include <ctype.h>
int atoi(char   *s, int N)
{
   int  n;  /* value being accumulated          */
   int  sign;   /* =1 if result is positive, -1 if negative */

   while((N>0)&&(*s == '\t' || *s == ' '))
   {
      N--;
      s++;  /* skip white space             */
   }
   sign=1;      /* assume a positive value          */

   if(*s == '+' || *s == '-')
   {
      N--;
      sign = *s++ == '-' ? -1 : 1;  /* adjust result sign   */
   }
   for(n=0; (N>0)&&isdigit(*s); s++,N--)
      n = n * 10 + *s - '0';

   return (sign * n);   /* result adjusted for sign     */
}