所以我刚开始为我的班级学习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位数。我到底错在了什么?
答案 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