【问题标题】:How do i check for numeric value in C language?如何在 C 语言中检查数值?
【发布时间】:2011-10-13 17:30:24
【问题描述】:

这个问题以前也有人问过,但是一直没找到清晰简单的答案,所以再问一次……

我想知道,在不使用 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);

【问题讨论】:

    标签: c numeric numerical


    【解决方案1】:

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

    【讨论】:

    • 我对 C 很陌生(我猜你已经知道了......)那么你所说的“解析”到底是什么意思? (可能是教程或维基百科页面的链接?)谢谢!
    【解决方案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);
    }
    

    【讨论】:

      【解决方案3】:

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

      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);
          }
      

      【讨论】:

      • 我刚试了一下,还是不行……比如输入字母b,就溢出了,又死循环了。
      • 显然,如果匹配失败,您还必须刷新输入缓冲区。维基百科建议只使用fgetssscanfen.wikipedia.org/wiki/Scanf#Error_handling
      • @blackjak231 我刚刚更新了我的代码,增加了一些流畅性。试试看。
      【解决方案4】:

      不要使用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
          }
      }
      

      瞧!

      【讨论】:

        【解决方案5】:

        我喜欢通用的:

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

        #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     */
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-14
          • 1970-01-01
          • 2019-12-27
          • 2014-10-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多