如果scanf()获取的字符不';与格式字符串不匹配? #包括 内部主(空) { int i,j,k; scanf(“%d%d%d”,&i,&j,&k); printf(“%d%d%d”,i,j,k); 返回0; }

如果scanf()获取的字符不';与格式字符串不匹配? #包括 内部主(空) { int i,j,k; scanf(“%d%d%d”,&i,&j,&k); printf(“%d%d%d”,i,j,k); 返回0; },c,scanf,C,Scanf,如果我们输入1,2,3,会发生什么?为什么 根据,如果scanf()读取了一个意外的字符串,它将提前返回,从而不会修改最后一个成功值之后的任何值 我在-O0上尝试了clang(LLVM 6.1.0),上面的解释是正确的,但在-O2上,第二个变量始终是一个随机数,但与之前的scanf()不同,第三个变量始终是0 这里给出的数据是正确的scanf将在输入中找到,时停止并返回。因此,j和k将被取消初始化。未初始化的变量具有不确定的值,如果是陷阱表示,这将调用未定义的行为 根据,scanf的返回值告诉您

如果我们输入
1,2,3
,会发生什么?为什么

根据,如果
scanf()
读取了一个意外的字符串,它将提前返回,从而不会修改最后一个成功值之后的任何值


我在
-O0
上尝试了clang(LLVM 6.1.0),上面的解释是正确的,但在
-O2
上,第二个变量始终是一个随机数,但与之前的
scanf()
不同,第三个变量始终是
0

这里给出的数据是正确的
scanf
将在输入中找到
时停止并返回。因此,
j
k
将被取消初始化。未初始化的变量具有不确定的值,如果是陷阱表示,这将调用未定义的行为

根据,
scanf
的返回值告诉您使用这些参数是否安全

成功完成后,这些功能应返回成功匹配和分配的输入项数量;如果早期匹配失败,此数字可以为零。如果输入在第一次匹配失败或转换之前结束,则应返回EOF。如果发生读取错误,则设置流的错误指示器,应返回EOF

如果要输入
1,2,3
,则
scanf
将返回
1
,指示第一个参数可以安全使用,并且在第一个
处发生匹配失败,因为它与根据格式字符串预期的输入不匹配


如果在此之后使用
j
k
,则代码将使用不确定值,这是未定义的行为,显然是要避免的不稳定行为的来源。。。检查
scanf
的返回值是非常重要的,因为您使用的链接也鼓励了它。

j
k
将是不确定的。未初始化的变量不会调用未定义的行为,尽管它们是不确定的。使用不确定值调用未定义的行为。@undefinedbehaviour;对最终他们将调用UB。
#include <stdio.h>

int main(void)
{
    int i, j, k;
    scanf("%d%d%d", &i, &j, &k);
    printf("%d %d %d", i, j, k);
    return 0;
}