我想写一个C程序来添加用户给定的任意数字列表…有人能修复这个程序吗?

我想写一个C程序来添加用户给定的任意数字列表…有人能修复这个程序吗?,c,C,我想写一个C程序来添加用户给定的数字,只要他们愿意。。。有人能修好这个程序吗 我尝试使用do while循环。 还有其他改进代码的建议吗? 我无法结束循环 #include <stdio.h> int main() { int x=0, sum = 0, y=0, fu; printf("first number you want to add:\n"); scanf("%d", &x); prin

我想写一个C程序来添加用户给定的数字,只要他们愿意。。。有人能修好这个程序吗

我尝试使用do while循环。 还有其他改进代码的建议吗? 我无法结束循环

#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 = %d\n", sum);

    return 0;
}
#包括
int main()
{
int x=0,sum=0,y=0,fu;
printf(“要添加的第一个数字:\n”);
scanf(“%d”和&x);
printf(“要添加的下一个号码:\n”);
scanf(“%d”和“&y”);
x=x+y;
做
{
printf(“是否要进一步添加数字?\n输入0:是或1:否:\n”);
scanf(“%d”和&fu);
printf(“要添加的下一个号码:\n”);
scanf(“%d”和“&y”);
x=x+y;
}
而(fu>0);
总和=x;
printf(“所有整数之和=%d\n”,总和);
返回0;
}
您的提示显示:

输入0:是或1:否:

因此,如果输入了
0
,则需要继续该循环:

while(fu == 0);

此外,在非
0
输入之后,您不需要再输入一个
y

如果
的话,在
中询问第三个和更多的数字,并在
时修改您的

scanf("%d", &fu);
    if(fu == 0) {
        printf("next number you want to add:\n");
        scanf("%d", &y);
        x=x+y;
    }
}
while(fu == 0);

从用户或文件中获取任何输入的关键是通过检查返回来验证每个输入。在知道输入是成功还是失败之前,不能盲目使用保存输入的变量。否则,如果输入失败,并且使用了值不确定的变量,则调用未定义的行为

此外,如果您使用的是格式化输入函数,如
scanf()
,如果出现匹配失败,则从
stdin
提取字符的过程将在该点停止,导致失败的字符将留在
stdin
--未读中,等待下次尝试输入时再次咬您

相反,如果使用面向行的输入函数,如
fgets()
或POSIX
getline()
,则一次读取一整行。您只需在由
fgets()
填充的缓冲区上调用
sscanf()
,即可将数字输入转换为整数值。这样,无论转换成功与否,都不会在输入流中留下任何未读内容

正如您必须验证每个输入一样,您也必须验证每个转换。无论是使用
sscanf()
还是
strtol()
等。。。如果未能验证每个转换,则当您未能检测到转换失败时,可能会导致未定义的行为

使用
fgets()
getline()
的另一个好处是它们读取并存储用户按Enter键发出的
'\n'
。因此,您不必提示
“您想进一步添加数字吗?\n输入0:Yes或1:No:\n”
,而需要担心另一个输入和转换——您只需检查是否在空行上按了Enter键,即可知道用户已完成的输入(例如,
fgets()在缓冲区字段中的第一个字符)
'\n'
字符)

您还必须正确处理无效输入。如果用户输入的是“香蕉”而不是数字,该怎么办

总之,你可以做类似的事情:

#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 : %d\n", sum);        /* output final sum */
}
有几种方法可以实现这一点,如果您希望用户能够在每行输入多个数字,可以使用
strtol()
解析
buf
,以提取所有值。(使用字符串开头的偏移量和每次转换时从
%n”
说明符消耗的字符,可以对
sscanf()
执行相同的操作)有很多方法


如果您还有其他问题,请告诉我。

您需要检查
scanf()
中的返回值,以确保它成功读取数字(如果没有,则应采取适当的措施)。让用户为每个要添加的数字键入两个数字并不是一个很好的界面。读到文件末尾(或出现错误)会更正常。我还注意到,你问“你想继续吗”,然后得到一个答案,然后忽略用户说的话。这不礼貌。在调试器中运行它。到时就会清楚了。
$ ./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