Ctrl + D后停止用户输入需要2次按下;为什么?

时间:2018-04-18 09:56:18

标签: c while-loop scanf eof

用户可以输入各种不同数量的数字(只要他们不输入超过5000个数字)。但是,当用户按下 CTRL + D 时,程序应该停止请求用户输入。到目前为止我已经做到了这一点。但是,我必须在停止之前按 CTRL + D 两次。有人可以帮我修理吗?

int input_array[MAX_NUMBERS] = {0};

scanf("%d", &input_array[0]);

int eof_detector = getchar();

int i = 0;
while ((i < 5000) && (eof_detector != EOF)) {
    i++;
    scanf("%d", &input_array[i]);
    eof_detector = getchar();
}

4 个答案:

答案 0 :(得分:2)

这是一个更简单的解决方案。

// When the person presses CTRL+D, scanf will return EOF.
// Since the return value is EOF and not 1, it will break
// out of the scanning while loop.
// Also note, you can scan numbers as a while loop
// condition.
int input_array[MAX_NUMBERS] = {0};

int i = 0;
while (
       (scanf("%d", &input_array[0]) == 1) &&
       (i < MAX_NUMBERS)
      ) {
    i++;
}

答案 1 :(得分:1)

你不需要在循环和放大之前单独使用getchar()内循环。在条件和条件下使用getchar()如果遇到输入结尾scanf()也将返回EOF,因此请检查scanf()返回值。这样做

int main() {
        int input_array[MAX_NUMBERS] = {0};
        int i = 0,ret;

        do {
                ret = scanf("%d", &input_array[i]);/* if you pressed
                                              CTRL+D, scanf return EOF */
                if(ret == EOF)/* if ctrl+d pressed,condition becomes true */
                        break;
                i++;
        }while ((i < 5000) && (getchar() != EOF));/* it won't check this
                                             bcz of break statement if CTRL+d pressed */
        return 0;
}

答案 2 :(得分:1)

您在EOF时可能会遇到scanf,因此您应该测试scanf的返回值,并在失败时调用feof(stdin)查看失败是由于EOF还是错误。

for(i=1;i<4999;i++){
   if(EOF==scanf("%d", &input_array[i])){
      if(feof(stdin)) /*EOF*/; else /*error*/;
      break;
   }
}

正如scanf(3)联机帮助页指示的那样,scanf会在错误上返回EOF(在这种情况下errno设置为联机帮助页中列出的值之一)或{{1} }。

答案 3 :(得分:1)

您不需要单独getchar来检查是否已达到EOF。 scanf如果遇到数据结尾,则会返回EOF。你的循环会像这样工作

  do {
      ret = scanf("%d", &input_array[i]);
      i++;
     } while ((i < 5000) && (ret != EOF));