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

Stopping user input after Ctrl+D requires 2 presses; why?

用户可以输入各种不同数量的数字(只要他们输入的数字不超过 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();
}

您无需在循环前和循环内分别使用 getchar()。在条件中使用 getchar() 并且 scanf() 将 return EOF 如果它遇到 输入结束 所以检查 return 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;
}

你很可能在scanf中遇到EOF,所以你应该做的是测试scanf的return值,当它失败时调用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 returns EOF 出现错误(在这种情况下 errno 被设置为联机帮助页)或 EOF.

您不需要getchar单独检查是否已达到EOF。如果遇到数据结束,scanf 本身会 return 一个 EOF。你的循环将像这样工作

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

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

// 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++;
}