有无限循环,因为 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 跳过任何前导空格,然后读取字符直到下一个非数字字符;该非数字字符留在输入流中。如果不调用 getcharfgetc 或类似的方法,该字符将不会被删除。

因此,在 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);
}