使用scanf返回值验证输入类型失败

使用scanf返回值验证输入类型失败,c,C,我想通过使用scanf的返回值检查c代码中的所有输入是否都是double类型: #include <stdio.h> int main() { double a,b,c; int x = scanf("%lf %lf %lf", &a, &b, &c); printf("%d", x); } 但我得到的是: 这里我期望1,但我得到0: 在这里,我期望2,但我得到1: 据 格式字符串由一系列指令组成,这些指令描述 如何处理输入字符的

我想通过使用scanf的返回值检查c代码中的所有输入是否都是double类型:


#include <stdio.h>

int main()
{
    double a,b,c;
    int x = scanf("%lf %lf %lf", &a, &b, &c);
    printf("%d", x);
}
但我得到的是:

这里我期望1,但我得到0: 在这里,我期望2,但我得到1: 据

格式字符串由一系列指令组成,这些指令描述 如何处理输入字符的序列。如果处理 指令失败,不读取进一步的输入,scanf返回

因此

关于案例1

当检测到第一个说明符不匹配时,scanf将停止读取

对于案例2

当检测到第二个说明符不匹配时,scanf将停止读取。

根据

格式字符串由一系列指令组成,这些指令描述 如何处理输入字符的序列。如果处理 指令失败,不读取进一步的输入,scanf返回

因此

关于案例1

当检测到第一个说明符不匹配时,scanf将停止读取

对于案例2

当检测到第二个说明符不匹配时,scanf将停止读取。

scanf会在任何转换失败时立即停止处理输入,从左到右,它不会尝试处理剩余的输入

所以当你进去的时候

b b 2.8
2 x 2.1
尝试进行第一次%lf转换时失败。由于未进行任何转换,因此返回0

当你进入

b b 2.8
2 x 2.1
它成功地将2转换为double,但在x上失败,因此它不处理2.1并返回1。

scanf在任何转换失败后立即停止处理输入,从左到右,它不会尝试处理其余的输入

所以当你进去的时候

b b 2.8
2 x 2.1
尝试进行第一次%lf转换时失败。由于未进行任何转换,因此返回0

当你进入

b b 2.8
2 x 2.1

它成功地将2转换为双精度,但在x上失败,因此它不会处理2.1并返回1。

不要将图像或链接发布到外部站点-输入和输出为纯文本,将其复制到问题中,并解释为什么您希望这些输出在第一次转换失败时失败。您的期望不合理。如果早期匹配失败,scanf将返回零。这就是你第一次跑步时发生的情况。scanf的工作原理与您的预期相反。@EugeneSh:scanf在第一次失败的转换中没有失败。scanf返回指令失败时停止处理。scanf工作正常。不要将图像或链接发布到外部站点-输入和输出是纯文本的,请将其复制到问题中,并解释为什么您希望这些输出在第一次转换失败时失败。您的期望不合理。如果早期匹配失败,scanf将返回零。这就是你第一次跑步时发生的情况。scanf的工作原理与您的预期相反。@EugeneSh:scanf在第一次失败的转换中没有失败。scanf返回指令失败时停止处理。scanf工作正常。