使用scanf并检查输入是否为int

时间:2012-10-24 13:07:54

标签: c int scanf

我想检查给定的输入是否为整数输入。我不想将输入存储在字符串中。在看到有关stackoverflow和hit和trial的几个问题之后,我创建了以下代码

while(scanf("%d%c",&num,&a) != 2 || a != '\n')
{
    printf("Please enter an integer only : ");
    if(a == '\n')
        scanf("%c",&a);
    else
    {
        while(a != '\n')
            scanf("%c",&a);
    }
}

它有效但根据我的理解,以下应该也有效

while(scanf("%d%c",&num,&a) != 2 || a != '\n')
{
    printf("Please enter an integer only : ");
    while(a != '\n')
        scanf("%c",&a);
}

有人可以告诉我为什么上面没有用?如果有人有更好的解决方案,请同时给它。

注意:我正在考虑将12qwe视为无效输入。我只想要整数。

3 个答案:

答案 0 :(得分:3)

的问题
while(scanf("%d%c",&num,&a) != 2 || a != '\n')
{
    printf("Please enter an integer only : ");
    while(a != '\n')
        scanf("%c",&a);
}

如果a在扫描之前恰好包含'\n',并且扫描失败,则内部while循环根本不会运行。所以

  • 如果扫描尝试解析输入流中的int失败,因为输入是例如"ab c\n",有问题的输入仍保留在输入流中,外部scanf循环控件中的下一个while无法再次解析inta仍然'\n' 1}},重复。

  • 如果在将流中的字符读入a之前发生输入错误,则外循环控制中的scanf会因为流已损坏而失败,重复。

    < / LI>

在另一个版本中,

while(scanf("%d%c",&num,&a) != 2 || a != '\n')
{
    printf("Please enter an integer only : ");
    if(a == '\n')
        scanf("%c",&a);
    else
    {
        while(a != '\n')
            scanf("%c",&a);
    }
}

只要有要从流中读取的输入,您至少会取得一些进展,因为无论a包含什么,您在尝试下一次解析{{{{}}之前,会从输入流中读取至少一个字符。 1}}。如果输入流被破坏/关闭/过早结束,例如,它也将导致无限循环。如果你从一个空文件重定向stdin。您可以通过提供诸如“a \ nb \ nc \ nd \ n”之类的输入来使该循环也输出多个int消息。

因此,在转换输入中的任何内容之前,您应该检查"Please enter an integer only : "是否遇到了流的结尾或其他一些读错误,并在这种情况下中止:

scanf

答案 1 :(得分:1)

这是一种错误的做法。您可以使用fgets()读取输入,然后解析整数ASCII范围的字符串。

fgets(s, 1024, stdin)

for (i=0; s[i] ! = '\0';i++) {
if( s[i] <'0' && s[i] >'9')
  // not an integer<br>

您还可以使用标准功能,例如isalnumisalpha等。

答案 2 :(得分:1)

它有效......

while(scanf("%d%c",&num,&a) != 2 || a != '\n')
{
    printf("Please enter an integer only : ");
    do{
        scanf("%c",&a);
    }while(a != '\n');
}