3

我想检查给定的输入是否是整数输入。我不想将输入存储在字符串中。在看到有关 stackoverflow 的几个问题并通过点击和试用后,我创建了以下代码

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 也视为无效输入。我只想要整数。

4

3 回答 3

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从输入流中解析 an 失败,因为输入是 eg "ab c\n",有问题的输入仍保留在输入流中,scanfwhile循环控制中的下一个int再次解析失败,a保留'\n',重复。

  • 如果在将字符从流中读取到 之前发生输入错误ascanf则外部循环控制由于流损坏而失败,请重复。

在另一个版本中,

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包含什么,在尝试下一次解析int. 如果输入流被损坏/关闭/过早结束,它也会导致无限循环,例如,如果您从空文件重定向标准输入。您还可以"Please enter an integer only : "通过输入“a\nb\nc\nd\n”之类的输入来让该循环输出多条消息。

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

int reads;
while(((reads = scanf("%d%c", &num, &a)) != 2 && reads != EOF) || a != '\n')
{
    printf("Please enter an integer only : ");
    // read at least one character until the next newline
    do {
        reads = scanf("%c", &a);
    }while(reads != EOF && a != '\n');
}
于 2012-10-24T15:23:04.567 回答
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

于 2012-10-24T13:11:54.007 回答
1

它工作......</p>

while(scanf("%d%c",&num,&a) != 2 || a != '\n')
{
    printf("Please enter an integer only : ");
    do{
        scanf("%c",&a);
    }while(a != '\n');
}
于 2012-10-24T14:44:07.110 回答