如何在C中循环退出?

时间:2017-02-11 03:54:16

标签: c scanf

#include<stdio.h>
#define LINESIZE 1024

int n, sum =0;
char line[LINESIZE];

int main() {
    while(1) {
        printf("enter an integer: ");
        if(!fgets(line, LINESIZE, stdin)) {
            clearerr(stdin);
            break;
        }

        if (sscanf(line, "%d", &n) == 1)
            sum += n;
    }
    printf("%d \n",sum);
}

当我在Cygwin中运行时,输出似乎无限,我不知道如何返回sum?我错过了什么吗?

enter an integer: 1
enter an integer: 2
enter an integer: 3
enter an integer: 4
enter an integer: 5
enter an integer: 6

2 个答案:

答案 0 :(得分:3)

你的while循环没问题,程序循环直到它到达stdin的文件末尾。在终端上,您可以通过在Unix下按 Ctrl-D 并在Windows上按 Ctrl-Z Enter 来发出文件结束信号。

或者,您可以在阅读某些特定输入时退出循环,例如空白行,没有数字的行,带有单词quit的行...

关于该计划的一些评论:

  • 没有理由让您的变量全局化,也无法清除stdin上的错误条件。
  • 无限循环的惯用语句是for (;;) { ... }
  • main()应返回0.

以下是您的计划的修改版本:

#include <stdio.h>

#define LINESIZE 1024

int main(void) {
    char line[LINESIZE];
    int n, sum = 0;

    for (;;) {
        printf("enter an integer: ");
        if (!fgets(line, sizeof line, stdin)) {
            break;
        }
        if (*line == '\n') {
            /* stop on empty line */
            break;
        }
        if (!strcmp(line, "quit\n")) {
            /* stop if the user types quit */
            break;
        }
        if (sscanf(line, "%d", &n) == 1) {
            sum += n;
        }
    }
    printf("%d\n", sum);
    return 0;
}

答案 1 :(得分:0)

除了问题中提到的评论之外,我还想提出一个稍微不同的方法。您可以修改计算if的{​​{1}}语句,以便当用户的输入不是sum时,您选择退出while循环。

int

示例输出1:

    if (sscanf(line, "%d", &n) == 1) {
        sum += n;
    }
    else {
        printf("Could not get integer\n");
        break;
    }

样本输出2:sscanf从5gf成功提取5

enter an integer:
3
enter an integer:
4
enter an integer:
2
enter an integer:
r
Could not get integer

9

示例输出3:sscanf无法从r5f中提取5并且正确如此

enter an integer:
3
enter an integer:
4
enter an integer:
5gf
enter an integer:
t
Could not get integer

12