所以我试图找到未知数量的用户输入数字的总和。这是我的代码
int main()
{
int tmp1 = 1;
int tmp2 = 1;
int total = 0;
printf("Enter numbers for a sum: ");
tmp2 = scanf(" %d", &tmp1);
while(tmp2 > 0){
total+=tmp1;
tmp2 = scanf(" %d", &tmp1);
}
printf("total is %d", total);
return 0;
}
它陷入无限循环,然后一旦我点击ctrl-c结束它,它就会输出正确的总和。所以我做错了是我怎么知道什么时候扫描所有整数,以及循环结束;因为我现在没有正确地做到这一点
答案 0 :(得分:0)
决定让它通过ctrl d停止,并且可以接受。感谢
答案 1 :(得分:0)
在你的问题中,不清楚你希望你的程序如何理解不再有输入的数字。应该是通过一个特定的角色?或者它只是得到一行空格分隔的数字并用一个总和来回应?
从您的代码中,我最明智的猜测是:您希望它理解在遇到非数字字符时不会再添加任何数字。我的猜测是这样的,因为通过检查scanf
的返回值,这几乎就是您的代码所做的。
首先,您必须将循环中的tmp
更改为tmp1
,因为没有声明tmp
的变量。 编辑:好吧,没关系
然后尝试运行你的程序,输入任意数量的空格(空格,制表符或换行符)分隔数字,然后输入你喜欢的任何非数字字符。例如,T
或ThoAppelsin
可能无关紧要。程序不会超越第一个字符,实际上甚至超出了第一个字符。之后,您将看到数字已正确添加在一起。
由于你对一个不存在的无限循环感到困惑,我的第二个猜测是你可能实际上希望它得到一行空格分隔的数字,并打印出总和;并且将你的程序误解为“在无限循环中”,而它只是期望你的进一步输入,就像它在开始时一样。
您不会从非重定向0
获得scanf("%d", &var);
,除非您使用与格式字符串不匹配的内容来提供异常终止。如果输入流中没有任何东西要消耗,它只会等待更多输入。但是说你给它一个'a'
,那么它所能做的就是放弃并返回零,因为它不能做一个任务。
如果你真的希望有一行数字,那么我可以提供的最小变化就是这样:
int main(void) { int tmp1 = 1; char tmp2 = 0; int total = 0;
printf("Enter numbers for a sum: ");
scanf("%d%c", &tmp1, &tmp2);
while(tmp2 == ' '){
total+=tmp1;
scanf("%d%c", &tmp1, &tmp2);
}
printf("total is %d", total);
return 0;
}
当然,这种方法有很多漏洞。但是,如果用户要严格输入如下序列:
3 66 2 10 6
// mind the new-line
它会正常工作。但是,如果我允许改变超过最小值,我就会这样做:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
int main(void)
{
int LastNumber = 0;
int UpcomingCharacter = 0;
int Total = 0;
printf("Enter numbers for a sum: ");
while(scanf("%d%*[ \t]", &LastNumber) == 1)
{
Total += LastNumber;
UpcomingCharacter = getchar( );
if (!isdigit(UpcomingCharacter)) // eliminates a possible EOF return as well
break;
if (ungetch(UpcomingCharacter, stdin) != UpcomingCharacter)
{
fprintf(stderr, "%d: unexpected error with ungetch\n", __LINE__);
return EXIT_FAILURE;
}
}
printf("total is %d", Total);
return EXIT_SUCCESS;
}
在任何以空格分隔的数字序列中哪个应该可以正常工作,当然不包括新行。