`sscanf`保证不会改变它找不到的参数吗?

Rei*_*ica 5 c scanf

我有一个案例,我不确定我是否会得到足够的输入sscanf.我可以安全地假设sscanf不会弄乱它找不到的任何争论吗?

例如,在此程序中:

#include <stdio.h>

int main(int argc, char** argv) {
    int a = 0, b = 0, c = 0;
    sscanf("1 2", "%d %d %d", &a, &b, &c);
    printf("%d %d %d\n", a, b, c);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

1 2 0

所以,它读了三个数字中的两个,并没有弄乱最后一个.在这种情况下,我是否可以安全地假设所有编译器和标准库也将仅留下最后一个参数,或者我是否需要执行以下操作:

int main(int argc, char** argv) {
    int a = 0, b = 0, c = 0;
    if (sscanf("1 2", "%d %d %d", &a, &b, &c) != 3) {
        c = 0;
    }
    printf("%d %d %d\n", a, b, c);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

srk*_*ish 4

你是完全安全的。

\n

在 C11 中,7.21.6.7 sscanf 函数

\n
\n

2. ...到达字符串末尾相当于 fscanf 函数遇到 end-\xef\xac\x81le。

\n
\n

7.21.6.2 fscanf 函数表示,

\n
\n

4. fscanf 函数依次执行该格式的每个指令。当所有指令都已执行时,或者指令失败(如下详述)时,函数将返回。失败被描述为输入失败(由于出现编码错误或输入字符不可用)或匹配失败(由于输入不正确)。

\n

16. 如果在 \xef\xac\x81rst 转换(如果有)完成之前发生输入失败,则 fscanf 函数返回宏 EOF 的值。否则,该函数返回分配的输入项数。

\n
\n

你的情况是输入失败。

\n