Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在scanf in循环中添加数字?_C_Loops_Scanf_Do While - Fatal编程技术网

如何在scanf in循环中添加数字?

如何在scanf in循环中添加数字?,c,loops,scanf,do-while,C,Loops,Scanf,Do While,是否有某种方法可以将scanf循环中的所有数字相加?如果输入数字为负数,循环将停止。问题是负数也必须包含在总和中 在这里,我设法得到了循环中重复的所有正scanf值的总和,但负数仍然不包括在所有数字的总和中 #include <stdio.h> main() { int z, x; printf("Enter a number:\n"); z = 0; scanf("%d", &x); do

是否有某种方法可以将
scanf
循环中的所有数字相加?如果输入数字为负数,循环将停止。问题是负数也必须包含在总和中

在这里,我设法得到了循环中重复的所有正
scanf
值的总和,但负数仍然不包括在所有数字的总和中

#include <stdio.h>

main()
{
    int z, x;

    printf("Enter a number:\n");
    z = 0;
    scanf("%d", &x);
    do
    {
        z += x;
        scanf(" %d", &x);
    } while (x >= 0);
    printf("Sum = %d ", z);

    return 0;
}
#包括
main()
{
int z,x;
printf(“输入一个数字:\n”);
z=0;
scanf(“%d”和&x);
做
{
z+=x;
scanf(“%d”和&x);
}而(x>=0);
printf(“总和=%d”,z);
返回0;
}

将循环内的线反转应该可以:

int z, x;
int ch;

printf("Enter a number:\n");
z = 0;
do
{
    if (scanf("%d", &x) == 1) // checking if parsing was successful
    {
        z += x; // if so, perform the sum
    }
    else
    {
        puts("Bad input");                             // if user inputs a bad value
        while((ch = getchar()) != '\n' && ch != EOF){} // you clear the input buffer
    }

} while (x >= 0);
printf("Sum = %d ", z);

请注意,我还删除了循环外的第一个扫描,这是不必要的。

反转循环内的线应该可以做到这一点:

int z, x;
int ch;

printf("Enter a number:\n");
z = 0;
do
{
    if (scanf("%d", &x) == 1) // checking if parsing was successful
    {
        z += x; // if so, perform the sum
    }
    else
    {
        puts("Bad input");                             // if user inputs a bad value
        while((ch = getchar()) != '\n' && ch != EOF){} // you clear the input buffer
    }

} while (x >= 0);
printf("Sum = %d ", z);

请注意,我还删除了循环外的第一个扫描,这是不必要的。

do中的语句顺序进行简单的重新排列。。。而
循环(以及删除前面的
scanf
调用)将实现以下功能:

#包括
int main()//您正在返回“0”,所以将“int”声明为返回类型
{
int x=0,z=0;//与声明同时初始化更容易。
printf(“输入一个数字:\n”);
//scanf(“%d”,&x);//不要在这里阅读-在循环中阅读。
做{
int test=scanf(“%d”,&x);//作为循环中的第一条语句读取。。。
如果(test!=1){//如果“scanf”调用失败,我们需要清除输入流。。。
INTC;
而((c=getchar())!='\n'&&c!=EOF)
;//清除任何有问题的输入
如果(c==EOF)break;//可能无法从EOF恢复,请退出while循环
}
否则z+=x;/…那么我们可以加x,即使它是负数
}while(x>=0);//但无论如何,当循环为负时结束循环
printf(“总和=%d”,z);
返回0;
}

请注意,我添加了一个
test
变量,以确保
scanf
操作成功。如果苏联输入
foo
(如William Pursell的评论中所述),那么输入缓冲区将被清除,添加将被跳过,并且将再次尝试读取。

do中的语句顺序进行简单的重新排列。。。而
循环(以及删除前面的
scanf
调用)将实现以下功能:

#包括
int main()//您正在返回“0”,所以将“int”声明为返回类型
{
int x=0,z=0;//与声明同时初始化更容易。
printf(“输入一个数字:\n”);
//scanf(“%d”,&x);//不要在这里阅读-在循环中阅读。
做{
int test=scanf(“%d”,&x);//作为循环中的第一条语句读取。。。
如果(test!=1){//如果“scanf”调用失败,我们需要清除输入流。。。
INTC;
而((c=getchar())!='\n'&&c!=EOF)
;//清除任何有问题的输入
如果(c==EOF)break;//可能无法从EOF恢复,请退出while循环
}
否则z+=x;/…那么我们可以加x,即使它是负数
}while(x>=0);//但无论如何,当循环为负时结束循环
printf(“总和=%d”,z);
返回0;
}

请注意,我添加了一个
test
变量,以确保
scanf
操作成功。如果苏联输入
foo
(如William Pursell评论中所述),则输入缓冲区将被清除,添加将被跳过,并且将再次尝试读取。

我不确定您是否希望将不包含负值的输入流作为错误处理,但您可以简单地执行以下操作:

#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
    int sum = 0, x, rv;
    while( 1 == (rv = scanf ("%d", &x)) ){
        sum += x;
        if( x < 0 ){
            break;
        }
    }
    if( rv == 0 ){
        fprintf(stderr, "Invalid input\n");
    } else {
        printf("Sum = %d\n", sum);
    }
    return rv == 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}

我不确定您是否希望将不包含负值的输入流作为错误处理,但您可以简单地执行以下操作:

#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
    int sum = 0, x, rv;
    while( 1 == (rv = scanf ("%d", &x)) ){
        sum += x;
        if( x < 0 ){
            break;
        }
    }
    if( rv == 0 ){
        fprintf(stderr, "Invalid input\n");
    } else {
        printf("Sum = %d\n", sum);
    }
    return rv == 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}

当输入为
foo
时会发生什么?您必须检查由
scanf
返回的值。为什么选择2
scanf
?首先移除并移动
z+=x
scanf
之后。并删除
“%d”
中的空格。哦,这解决了我的问题,非常感谢!我不知道为什么我在第一页加上了scanf。也许我已经解决了好几个小时了,我忘了我添加了它。当输入是
foo
时会发生什么?您必须检查由
scanf
返回的值。为什么选择2
scanf
?首先移除并移动
z+=x
scanf
之后。并删除
“%d”
中的空格。哦,这解决了我的问题,非常感谢!我不知道为什么我在第一页加上了scanf。也许我已经解决了好几个小时了,我忘了我添加了它。如果(test!=1)继续,那么
而(x>=0)?UB.@i486点不错,位置也不错。初始化
x=0
应该可以解决这个问题(请参见编辑)。@anastaciu。我改进了错误处理(以与您类似的方式)
而(x>=0)?UB.@i486点不错,位置也不错。初始化
x=0
应该可以解决这个问题(请参见编辑)。@anastaciu。我改进了错误处理(以与您类似的方式)。