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