C编程循环不会因scanf!= 0而停止

时间:2015-03-21 11:34:48

标签: c scanf

这有什么问题?另外,我必须使用scanf()。它应该读取任何整数并对它们求和,循环将在输入0时停止。

main (void){

int a;
int r=0;

while(scanf(" %d",&a)){
    r=r+a;
    }

printf("the sum is %d\n",r);

return 0;
}

2 个答案:

答案 0 :(得分:4)

引自man

  

这些函数返回分配的输入项数。这个   可        如果匹配失败,则少于提供的数量,甚至为零        URE。零表示虽然有可用的输入,但没有收敛 -        分配了sions;通常这是由于输入字符无效,        例如'%d'转换的字母字符。
       值EOF是        如果在任何转换(如结束)之前发生输入故障,则返回        发生了文件。如果转换后发生错误或文件结束        开始时,成功完成的转换次数是        返回。

所以,这几乎解释了scanf()返回的内容。

您可以通过添加( 1 == scanf("%d", &a) && a != 0 )作为while循环中的条件来解决问题,例如

int main (void)
  {

    int a;
    int r=0;

    while( 1 == scanf("%d", &a) && a != 0 )
      {
         r=r+a;
      }

    printf("the sum is %d\n",r);

    return 0;
  }

另请注意,您必须将主要类型指定为int main()

我还想补充说,当您输入'c'(或字符串)这样的字符时,循环将结束,并且它将显示您在输入字符之前输入的所有数字的总和。

答案 1 :(得分:1)

scanf()不会返回写入变量的内容。它返回成功填充的的总数。

修改

使用fgets()阅读stdin,然后使用sscanf()获取整数,您可以更好,您可以针对0进行检查。

#define BUFF_SIZE 1024

int main (void)
{
    int a;
    int r = 0;
    char buffer[BUFF_SIZE] = {0};
    while(1) {
        fgets(buffer, sizeof buffer, stdin);
        sscanf(buffer, "%d", &a);
        if(!a)
            break;
        r = r + a;
    }

    printf("the sum is %d\n", r);

    return 0;
}