输入说明:
您的程序将在一个或多个测试用例上进行测试。每个测试用例由单个正数(0
输入文件的最后一行有一个零(不是测试用例的一部分。)
我刚刚输入了这样的代码:
int main()
{
int n0;
while((scanf("%d", &n0)) != 0)
{
..........
}
但为什么输入0仍然处理?
答案 0 :(得分:1)
while (1) {
scanf("%d", &n0);
if (n0==0) break;
...
}
答案 1 :(得分:1)
0仍然处理,因为scanf的返回值是它填充的项目数。如果输入文件以0结尾,它将返回1 - 而不是零。
你想要检测你的值何时为零,然后突破循环。
答案 2 :(得分:0)
这是一个使用C&C很少记忆的操作员之一的完美场所,",#34;或排序操作员。这里重写了您的代码以便使用它:
#include <stdio.h>
int main()
{
char *str[] = { "123", "456", "789", "0" };
int i = 0;
int n0;
int scanret;
while((scanret = sscanf(str[i], "%d", &n0)), n0 != 0)
{
printf("i = %d n0 = %d scanret = %d\n", i, n0, scanret);
i += 1;
}
printf("i = %d n0 = %d scanret = %d after loop termination\n", i, n0, scanret);
}
查看while
循环的条件。这里发生的是首先评估sscanf,然后评估测试n0 != 0
。请注意,这不是&#39;和&#39;或者&#39;或&#39;运算符(您可以通过检查下面的示例输出来确定) - 执行sscanf,然后将n0 != 0
的结果用作while
循环的测试,因为while
使用了在条件中评估的最后一个表达式的值作为条件的值。
如果你运行它,你将获得类似于:
的输出i = 0 n0 = 123 scanret = 1
i = 1 n0 = 456 scanret = 1
i = 2 n0 = 789 scanret = 1
i = 3 n0 = 0 scanret = 1 after loop termination
分享并享受。