这就是问题:
你的程序是使用蛮力方法来找到生命,宇宙和万物的答案。更确切地说......从输入到输出重写小数字。读取数字42后停止处理输入。输入的所有数字都是一位或两位数的整数。
输入:
1
2
88个
42个
99个
我的第一段代码不起作用:
while( scanf("%d\n", &n) != 42 ){
printf("%d\n",n);
}
第二个代码,带有for循环,但是有一个测试用例没有数字42所以它返回TLE,我如何检查输入结束?
for(i=1;i>0;i++){
scanf("%d\n",&n);
if(n!=42 ){ /* end of input??? */
printf("%d\n",n);
}
else {
break;
}
}
为什么循环工作不应该如此?
答案 0 :(得分:2)
scanf
返回扫描的字符数,而不是结果。
所以,写while while循环如下:
scanf("%d", &n);
while( n != 42 ){
printf("%d\n",n);
scanf("%d", &n);
}
答案 1 :(得分:1)
总是很好避免魔术数字。定义常量。
检查scanf()
(@Joachim Pileborg)的结果
要检查输入是否有效,请测试scanf()
结果是否为1(正确扫描1个格式说明符)。
要检查输入结束,请测试scanf()
结果是否为EOF。
while
循环失败。粗略地,scanf()
报告扫描的字段数,而不是扫描的值。
scanf()
有很多。如果是这样,请阅读C规范的scanf()
部分。 Where do I find the current C or C++ standard documents?
const int Answer_to_Life_the_Universe_and_Everything = 42;
int n;
int cnt;
// Use 2d to limit to 2 digits
while ((cnt = scanf("%2d\n",&n)) == 1) {
if(n != Answer_to_Life_the_Universe_and_Everything) { /* end of input? */
printf("%d\n",n);
}
else {
break;
}
}
if (cnt != EOF) Handle_UnexpectedInput(); // example someone type in "junk"