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