scanf 在 C 中导致无限循环
scanf causing infinite loop in C
我对 C 比较陌生,但我已经编程几年了。
我正在为大学写程序class,我很困惑为什么没有调用下面的scanf函数,导致死循环。
我试过将我的 scanf 放在函数外部,调用它两次,一次从内部,一次从外部,以及其他几种方式。我在网上看到 fflush 可能有用,但没有用
有什么建议吗?
// store starting variables
int players;
// print title
printf("*------------------------------------*\n");
printf("| |\n");
printf("| Wheel |\n");
printf("| of |\n");
printf("| Fortune |\n");
printf("| |\n");
printf("*------------------------------------*\n");
printf("\n\nHow many players are there?: ");
while(scanf("%d", &players) != 1 && players >= 0) {
printf("That isn't a valid number of players. Try again: ");
fflush(stdin);
}
编辑 刚意识到我忘了说点什么。当我输入一个实际数字时,这个程序完美运行。我想让它安全,因为如果用户输入的不是字符串,它不会导致程序无限循环。
使用 fgets 将输入检索为字符串,并使用 sscanf 将其转换为数字。这样做是为了防止转换中的错误阻止从标准输入读取。您可以打印 scanf return 代码和播放器的值,以查看您真正收到的内容。您还应该检查文件结尾,这也会导致无限循环,因为 EOF 将不再有任何输入。
可能的非数字输入在 stdin
中。 OP的代码不使用它。结果:无限循环。
最好使用 fgets()
。
然而,如果 OP 确定要使用 scanf()
,请测试其输出并根据需要使用非数字输入。
int players;
int count; // Count of fields scanned
while((count = scanf("%d", &players)) != 1 || players <= 0) {
if (count == EOF) {
Handle_end_of_file_or_input_error();
return;
// non-numeric input
} else if (count == 0) {
int ch;
while (((ch = fgetc(stdin)) != '\n') && (ch != EOF)) {
; // get and toss data until end-of-line
}
// input out of range
} else {
; // Maybe add detailed range prompt
}
printf("That isn't a valid number of players. Try again: ");
}
我对 C 比较陌生,但我已经编程几年了。
我正在为大学写程序class,我很困惑为什么没有调用下面的scanf函数,导致死循环。
我试过将我的 scanf 放在函数外部,调用它两次,一次从内部,一次从外部,以及其他几种方式。我在网上看到 fflush 可能有用,但没有用
有什么建议吗?
// store starting variables
int players;
// print title
printf("*------------------------------------*\n");
printf("| |\n");
printf("| Wheel |\n");
printf("| of |\n");
printf("| Fortune |\n");
printf("| |\n");
printf("*------------------------------------*\n");
printf("\n\nHow many players are there?: ");
while(scanf("%d", &players) != 1 && players >= 0) {
printf("That isn't a valid number of players. Try again: ");
fflush(stdin);
}
编辑 刚意识到我忘了说点什么。当我输入一个实际数字时,这个程序完美运行。我想让它安全,因为如果用户输入的不是字符串,它不会导致程序无限循环。
使用 fgets 将输入检索为字符串,并使用 sscanf 将其转换为数字。这样做是为了防止转换中的错误阻止从标准输入读取。您可以打印 scanf return 代码和播放器的值,以查看您真正收到的内容。您还应该检查文件结尾,这也会导致无限循环,因为 EOF 将不再有任何输入。
可能的非数字输入在 stdin
中。 OP的代码不使用它。结果:无限循环。
最好使用 fgets()
。
然而,如果 OP 确定要使用 scanf()
,请测试其输出并根据需要使用非数字输入。
int players;
int count; // Count of fields scanned
while((count = scanf("%d", &players)) != 1 || players <= 0) {
if (count == EOF) {
Handle_end_of_file_or_input_error();
return;
// non-numeric input
} else if (count == 0) {
int ch;
while (((ch = fgetc(stdin)) != '\n') && (ch != EOF)) {
; // get and toss data until end-of-line
}
// input out of range
} else {
; // Maybe add detailed range prompt
}
printf("That isn't a valid number of players. Try again: ");
}