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