2

所以我刚刚开始为我的一个班级学习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 位数字。我在这里到底做错了什么?

4

3 回答 3

7

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

-format-specifier 表示十进制数,因此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);
}
于 2012-10-07T08:32:36.703 回答
2

我可能错了,但%d意思是“整数”,而不是“数字”。55第一个也是如此%d,然后第二个没有定义。

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

于 2012-10-07T08:31:50.583 回答
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(“a1”)== 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
于 2012-10-07T08:32:30.900 回答