如何检查用户是否使用scanf输入整数

时间:2014-04-21 00:17:26

标签: c scanf

我创建了一个程序,用*'s制作钻石。我正在寻找一种方法来检查输入的类型是否是C语言中的整数。如果输入不是整数,我希望它打印一条消息。

这就是我到目前为止:

if(scanf("%i", &n) != 1)
   printf("must enter integer");

但是,如果消息不是整数,则不会显示该消息。任何有关此问题的帮助/指导将不胜感激!

5 个答案:

答案 0 :(得分:1)

您可以在字符串中扫描输入,然后逐个检查其字符,此示例显示结果:

  1. 0,如果它不是数字
  2. 1如果是数字
  3. 你可以用它来制作你想要的输出

    char n[10];
    int i=0;
    scanf("%s",  n);
    
    while(n[i] != '\0')
    {
    printf("%d", isdigit(n[i]));
    i++;
    }
    

    示例:

    #include <stdio.h>
    #include <string.h>
    
    main()
    {
        char n[10];
        int i=0, flag=1;
       scanf("%s",  n);
    
       while(n[i] != '\0'){
       flag = isdigit(n[i]);
       if (!flag) break;
       i++;
       }
    
       if(flag) 
       { 
           i=atoi(n);
           printf("%d", i);
       }
       else
       {
           printf("it's not integer");
       }
    
    }
    

答案 1 :(得分:1)

使用fgets()后跟strtol()sscanf(..."%d"...)

强大的代码需要处理IO和解析问题。 IMO,这些最好分开完成。

char buf[50];
fgets(buf, sizeof buf, stdin);
int n;
int end = 0; // use to note end of scanning and catch trailing junk
if (sscanf(buf, "%d %n", &n, &end) != 1 || buf[end] != '\0') {
  printf("must enter integer");
}
else {
  good_input(n);
}

注意:

strtol()是一种更好的方法,但还需要更多步骤。 Example

其他错误检查包括测试fgets()的结果,并确保n的范围对于代码是合理的。

注意:

避免在同一代码中混用fgets()scanf() {我在这里说scanf()而不是sscanf()。 }
建议不要使用scanf()

答案 2 :(得分:0)

     strtol

返回的endPtr将指向转换中使用的最后一个字符。

虽然这确实需要使用类似fgets的东西来检索输入字符串。

个人偏好是scanf用于机器生成的输入而非人为生成。

答案 3 :(得分:0)

尝试添加

fflush(stdout);
printf之后

。或者,让printf输出一个以\n结尾的字符串。

假设已经完成此操作,当且仅当未输入整数时,您实际发布的代码才会显示该消息。您无需使用fgets或其他任何内容替换此行。

如果它似乎无法按预期工作,问题必定在其他地方。例如,在此行之前的输入中可能还有缓冲区中剩余的字符。请发布一个显示问题的完整程序以及您提供的输入。

答案 4 :(得分:0)

尝试:

#include <stdio.h>
#define MAX_LEN 64

int main(void)
   { bool act = true;
     char input_string[MAX_LEN];  /* character array to store the string */
     int i;

     printf("Enter a string:\n");
     fgets(input_string,sizeof(input_string),stdin);  /* read the string */


     /* print the string by printing each element of the array */
     for(i=0; input_string[i] != 10; i++) // \0 = 10 = new line feed
        { //the number in each digits can be only 0-9.[ASCII 48-57]
          if (input_string[i] >= 48 and input_string[i] <= 57)
             continue;
          else //must include newline feed 
             { act = false; //0
               break;
             }
        }

    if (act == false)
       printf("\nTHIS IS NOT INTEGER!"); 

    else
       printf("\nTHIS IS INTEGER");

    return 0;
   }

[===&gt;]首先我们使用fgets接收输入。然后它将开始从输入中拉出每个数字(从数字0开始)以检查它是否为0-9 [ASCII 48-57],如果它成功循环而非是字符 - 布尔变量'act'仍然保持为真。因此返回它的整数。