我想写一个C程序,把用户给定的数字加起来,只要他们愿意。。。有人能修复这个程序吗?
我试着用一个边做边循环。还有其他改进代码的建议吗?我无法结束循环。
#include <stdio.h>
int main()
{
int x=0, sum = 0, y=0, fu;
printf("first number you want to add:n");
scanf("%d", &x);
printf("next number you want to add:n");
scanf("%d", &y);
x=x+y;
do
{
printf("do you want to add numbers further? nEnter 0:Yes or 1:No: n");
scanf("%d", &fu);
printf("next number you want to add:n");
scanf("%d", &y);
x=x+y;
}
while(fu>0);
sum=x;
printf("Sum of all integers = %dn", sum);
return 0;
}
询问if
中的第三个和更多数字,并修改您的while
:
scanf("%d", &fu);
if(fu == 0) {
printf("next number you want to add:n");
scanf("%d", &y);
x=x+y;
}
}
while(fu == 0);
您的提示显示:
输入0:是或1:否:
因此,如果输入了0
,则需要继续该循环:
while(fu == 0);
此外,您不需要在非0
输入之后再使用另一个y
。
从用户或文件中获取任何输入的关键是通过检查返回来验证每一个输入。在知道输入是成功还是失败之前,不能盲目地使用包含输入的变量。否则,如果输入失败并且使用了值不确定的变量,则调用未定义的行为。
此外,如果您正在使用格式化的输入函数(如scanf()
(,如果出现匹配失败,则从stdin
中提取的字符将在此时停止,导致失败的字符将保留在stdin
中--未读,只是等待在下一次尝试输入时再次咬到您。
相反,如果使用面向行的输入函数,如fgets()
或POSIXgetline()
,则一次读取整行。您可以简单地在由fgets()
填充的缓冲区上调用sscanf()
,将数字输入转换为整数值。这样,无论转换成功还是失败,都不会在输入流中留下任何未读内容。
正如您必须验证每个输入一样,您也必须验证每个转换。无论是使用sscanf()
还是strtol()
等……当您未能检测到转换失败时,未能验证每个转换都可能导致未定义的行为。
使用fgets()
或getline()
的另一个好处是,它们从用户按下Enter读取并存储'n'
。因此,不必提示"do you want to add numbers further? nEnter 0:Yes or 1:No: n"
,也不必担心另一个输入和转换,只需检查是否在空行上按下了Enter即可知道用户完成的输入(例如,fgets()
存档的缓冲区中的第一个字符是'n'
字符(。
您还必须正确处理无效输入。如果用户输入"bananas"
而不是数字,该怎么办?
总之,你可以做一些类似的事情:
#include <stdio.h>
#define MAXC 1024 /* if you need a constant, #define one (or more) */
int main (void) {
char buf[MAXC]; /* buffer (character array) to hold all user input */
int sum = 0, n = 0; /* sum and count of numbers */
puts ("press ENTER alone to exit:n"); /* display instructions */
while (1) { /* loop continually */
int tmp; /* temporary int to add to sum */
/* prompt based on 1st or subsequent number */
fputs (n ? "next number : " : "first number : ", stdout);
/* read and validate input, break on EOF or empty line */
if (!fgets (buf, MAXC, stdin) || *buf == 'n') {
puts ("---------------------");
break;
}
/* validate conversion to int */
if (sscanf (buf, "%d", &tmp) == 1) { /* on success */
sum += tmp; /* add to sum */
n += 1; /* increment count */
}
else /* handle error */
fputs (" error: invalid integer input.n", stderr);
}
printf (" sum : %dn", sum); /* output final sum */
}
示例使用/输出
$ ./bin/sum
press ENTER alone to exit:
first number : 10
next number : -20
next number : 30
next number : -40
next number : bananas
error: invalid integer input.
next number : 50
next number :
---------------------
sum : 30
有几种方法可以实现这一点,如果您希望用户能够每行输入多个数字,则可以使用strtol()
解析buf
以提取所有值。(使用从字符串开头开始的偏移量和每次转换时从"%n"
说明符消耗的字符,可以对sscanf()
执行相同的操作(有很多方法。
如果您还有其他问题,请告诉我。