为什么我不能在第一个路径失败时再次对同一个变量使用 scanf

Yua*_*ian 1 c scanf

请看以下代码:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int n;
    int i = scanf("%d", &n);
    printf("%d\n", i);
    int j = scanf("%d", &n);
    printf("%d\n", j);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

假设我n第一次输入一个字符串,scanf会返回0;但是,为什么它不允许我n第二次输入值并且j是自动的0n即使我第一次输入了错误的值,我应该怎么做才能让它允许我再次输入一个值?

pax*_*blo 5

您几乎可以肯定输入了一个非数字值,这将导致第一个scanf失败,返回零并且(这是重要的一点)将流指针留在scanf调用之前的位置。

这意味着下次您调用它时,它只会尝试读取相同的数据。

零的返回值是一个死的赠品 -scanf返回成功扫描的项目数,所以零意味着你没有给它一个数字。

如果你输入数字,它工作正常,按照以下代码:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int n;
    int i = scanf("%d", &n);
    printf(">> %d %d\n", i, n);
    int j = scanf("%d", &n);
    printf(">> %d %d\n", j, n);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当你运行它并输入41and 时32,你会看到:

41
>> 1 41
32
>> 1 32
Run Code Online (Sandbox Code Playgroud)

每个 C 程序员在其职业生涯的某个阶段都会遇到该语言中用户输入的不足之处。基于行的输入的最佳选择是简单地找到一个做得好的函数,然后sscanf在结果字符串上使用。

一种确保行是基本单元,可以处理缓冲区溢出并确保多余的数据不会“破坏”未来的输入。

这是我之前准备的。