有无限循环,因为 scanf() 不会停止程序从用户那里获取条目
Having infinite loop because scanf() does not stop the program to take entry from user
我需要编写一个计算斐波那契数列的程序,但由于这个无限循环我卡住了。
当我输入 -5 时,它会打印 Please enter "positive" term(s) number:.
然后我输入“a”并打印请输入“数字”项数:无限。
我不明白这是为什么。感谢您的帮助。
(注意:我尝试使用 fflush(stdin) 但没有解决这个问题。我想可能 \n 字符留在 stdin 缓冲区中。)
#include <stdio.h>
void calculate_fibonacci_sequence(){
int n,is_entry_valid;
int flag = 0;
printf("Please enter term(s) number : ");
while(!flag){
is_entry_valid = scanf("%d",&n);
if(is_entry_valid == 1){
if(n > 0){
flag = 1;
}else{
printf("Please enter \"positive\" term(s) number: ");
}
}else{
printf("Please enter \"numeric\" term(s) number: ");
}
}
}
int main(){
calculate_fibonacci_sequence();
return(0);
}
%d
告诉 scanf
跳过任何前导空格,然后读取字符直到下一个非数字字符;该非数字字符留在输入流中。如果不调用 getchar
或 fgetc
或类似的方法,该字符将不会被删除。
因此,在 if (is_entry_valid == 1)
语句的 else
分支中,您需要添加类似
的内容
while ( getchar() != '\n' )
; // empty loop
这将从输入流中删除包括换行符在内的所有内容。
fgets
可用于读取一行然后用 sscanf
.
解析该行
在非整数输入的情况下,问题输入已被 fgets
删除,因此很容易再次尝试可接受的输入。
#include <stdio.h>
void calculate_fibonacci_sequence(){
char line[100] = "";
int n,is_entry_valid;
int flag = 0;
printf("Please enter term(s) number : ");
while(!flag){
fgets ( line, sizeof line, stdin);
is_entry_valid = sscanf(line, "%d",&n);
if(is_entry_valid == 1){
if(n > 0){
flag = 1;
}else{
printf("Please enter \"positive\" term(s) number: ");
}
}else{
printf("Please enter \"numeric\" term(s) number: ");
}
}
}
int main(){
calculate_fibonacci_sequence();
return(0);
}
当您收到错误的用户输入时,您需要刷新 stdin
以清理输入缓冲区,此代码应该有效:
#include <stdio.h>
void calculate_fibonacci_sequence(void)
{
int n, is_entry_valid;
int flag = 0;
printf("Please enter term(s) number : ");
while (!flag)
{
is_entry_valid = scanf("%d",&n);
if (is_entry_valid == 1) {
if (n > 0) {
flag = 1;
} else {
printf("Please enter \"positive\" term(s) number: ");
}
} else {
printf("Please enter \"numeric\" term(s) number: ");
int c;
// Flush stdin
while ((c = fgetc(stdin)) != EOF && c != '\n');
}
}
}
int main(void)
{
calculate_fibonacci_sequence();
return(0);
}
我需要编写一个计算斐波那契数列的程序,但由于这个无限循环我卡住了。
当我输入 -5 时,它会打印 Please enter "positive" term(s) number:.
然后我输入“a”并打印请输入“数字”项数:无限。
我不明白这是为什么。感谢您的帮助。
(注意:我尝试使用 fflush(stdin) 但没有解决这个问题。我想可能 \n 字符留在 stdin 缓冲区中。)
#include <stdio.h>
void calculate_fibonacci_sequence(){
int n,is_entry_valid;
int flag = 0;
printf("Please enter term(s) number : ");
while(!flag){
is_entry_valid = scanf("%d",&n);
if(is_entry_valid == 1){
if(n > 0){
flag = 1;
}else{
printf("Please enter \"positive\" term(s) number: ");
}
}else{
printf("Please enter \"numeric\" term(s) number: ");
}
}
}
int main(){
calculate_fibonacci_sequence();
return(0);
}
%d
告诉 scanf
跳过任何前导空格,然后读取字符直到下一个非数字字符;该非数字字符留在输入流中。如果不调用 getchar
或 fgetc
或类似的方法,该字符将不会被删除。
因此,在 if (is_entry_valid == 1)
语句的 else
分支中,您需要添加类似
while ( getchar() != '\n' )
; // empty loop
这将从输入流中删除包括换行符在内的所有内容。
fgets
可用于读取一行然后用 sscanf
.
解析该行
在非整数输入的情况下,问题输入已被 fgets
删除,因此很容易再次尝试可接受的输入。
#include <stdio.h>
void calculate_fibonacci_sequence(){
char line[100] = "";
int n,is_entry_valid;
int flag = 0;
printf("Please enter term(s) number : ");
while(!flag){
fgets ( line, sizeof line, stdin);
is_entry_valid = sscanf(line, "%d",&n);
if(is_entry_valid == 1){
if(n > 0){
flag = 1;
}else{
printf("Please enter \"positive\" term(s) number: ");
}
}else{
printf("Please enter \"numeric\" term(s) number: ");
}
}
}
int main(){
calculate_fibonacci_sequence();
return(0);
}
当您收到错误的用户输入时,您需要刷新 stdin
以清理输入缓冲区,此代码应该有效:
#include <stdio.h>
void calculate_fibonacci_sequence(void)
{
int n, is_entry_valid;
int flag = 0;
printf("Please enter term(s) number : ");
while (!flag)
{
is_entry_valid = scanf("%d",&n);
if (is_entry_valid == 1) {
if (n > 0) {
flag = 1;
} else {
printf("Please enter \"positive\" term(s) number: ");
}
} else {
printf("Please enter \"numeric\" term(s) number: ");
int c;
// Flush stdin
while ((c = fgetc(stdin)) != EOF && c != '\n');
}
}
}
int main(void)
{
calculate_fibonacci_sequence();
return(0);
}