为什么这个Scanf会导致无限循环?

时间:2012-10-07 08:28:34

标签: c loops char infinite-loop scanf

所以我刚开始为我的班级学习C语言,而且我一直在做这项任务,但这部分让我感到困惑。我有一些基本上看起来像的代码:

#include <stdio.h>
#include <string.h>

int main(void)
{
    int one = 0;
    int two = 0;
    char oneWord[100]; 
    char twoWord[100];

    printf("Enter a two digit number: ");
    scanf("%d%d", &one, &two);

    strcpy(firstWord, "Test");
    strcpy(secondWord, "Two");

    printf("%s", firstWord);

    return 0;
}

现在,除了程序的逻辑/目的之外,我无法弄清楚为什么scanf语句导致无限循环?我确定这是问题的原因,当我评论它并且最终的printf声明工作得很好。

我尝试将其更改为scanf("%d,%d", %one, %two),当我在输入中添加逗号时,这似乎工作正常。但我希望能够取55这样的数字并将其分成2位数。我到底错在了什么?

3 个答案:

答案 0 :(得分:7)

你遇到的不是无限循环,而是scanf等待更多输入。

d - 格式说明符表示十进制数,所以像“0”,“41”或“2342345”。

输入第一个号码后,希望该计划继续,但scanf刚刚完成第一个%d,所以scanf正在等待为了你完成第二个%d。这似乎是一个无限循环,但实际上是scanf做你命令它。

scanf无法猜出您想要的每个数字的位数。但你可以告诉它你想要它的方式,宽度说明符告诉每个信息由多少个字符组成:

#include <stdio.h>

int main () {
    int a, b;
    scanf("%2d%1d", &a, &b);
    printf("%d, %d", a, b);
} 

错误处理:

#include <stdio.h>

int main () {
    int a, b;
    if (scanf("%2d%1d", &a, &b) < 2)
        fprintf(stderr, "not enough digits");
    else
        printf("%d, %d", a, b);
}

答案 1 :(得分:2)

我可能错了,但%d表示“整数”,而不是“数字”。因此55是第一个%d,然后第二个未定义。

您可以尝试使用%c(一个字符)。

答案 2 :(得分:1)

printf("Enter a two digit number: ");
scanf("%1d%1d", &one, &two);

当然即使这样也会失败(不符合要求)
代替:

scanf("%d", &one);
if (one<10 || one>99) printf("I didn't expect that...\n");

scanf("%s",oneWord); one = atoi(oneWord);
if (one<10 || one>99)
   printf("Thats not necessarily even a number\n");
else
   { two = one % 10; one = one / 10; 
       printf("The first digit is %d and the second is %d\n",one,two);
   }

在后一个程序中,我们测试输入是否正确:
提供垃圾而不是正确的输入是一种很好的做法,并且可以看到它被忽视的地方。库函数atoi(string);返回字符串中包含的整数。如果没有找到整数,则它为零。例如(atoi(&#34; a1&#34;)== 0)。

但最低的正确答案是

scanf("%d", number);
if (number >= 10 && number <= 99) 
{
   one = number / 10;  // the first digit;
   two = number % 10;  // the second digit calculated as number modulo 10
}

scanf("%1d%d", &one, &two);  // would halt for a single character input