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

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

例如,在此程序中:

 #include  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; } 

输出是:

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; } 

你是完全安全的。

在C11中,7.21.6.7 sscanf函数

2. …到达字符串的末尾相当于遇到fscanf函数的结尾。

7.21.6.2 fscanf函数说,

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

16.如果在第一次转换(如果有)之前发生输入故障,fscanf函数将返回宏EOF的值。否则,该函数返回分配的输入项数。

您的情况是输入失败。

来自http://pubs.opengroup.org/onlinepubs/009695399/functions/scanf.html :

…如果参数保留时格式已用尽,则应评估多余的参数,否则将被忽略。

编辑:正如Kerrek正确注意到的,上述声明不适用于此处。 它与sscanf("1", "%d", &a, &b, &c) ,而与问题中的sscanf("1", "%d %d %d", &a, &b, &c)无关。

7.21.6.2,第21段:

例4在:
#include  /* ... */ int d1, d2, n1, n2, i; i = sscanf("123", "%d%n%n%d", &d1, &n1, &n2, &d2);
值123分配给d1,值3分配给n1。 因为%n永远不会得到 
输入失败时,值3也分配给n2。  d2的值不是  
  受影响 。 值1分配给i。

这是我能找到的最接近的事情,即如果没有相应的输入可用,则保证不会修改参数。

我在C11中找到的唯一参考是针对fscanf ,7.21.6.2/10,它说:

转换的结果放在由尚未收到转换结果的format参数后面的第一个参数指向的对象中。

我将“置于”中解释为“被分配给”,并且我有理由相信这意味着当且仅当匹配时才会发生赋值,否则不会触及收件人变量。

注意,当然,在函数调用之前计算所有变量参数; 这与scanf无关。

存在保证。 sscanf()不会将任何东西分配给额外的参数。 您可以避免检查此值的返回值

C库函数int sscanf(const char *str, const char *format, ...)从字符串而不是stdin读取格式化输入

成功时,该函数返回成功填充的参数列表中的项数。

失败时,此count can match the expected number of items or be less (even zero) in the case of a matching failure. 如果在成功解释任何数据之前输入失败,则返回EOF。

如果转换规范的参数太多,则会计算额外参数,否则将忽略这些参数。

如果转换规范没有足够的参数,则不会定义结果。

所有三个函数(fscanf, scanf, and sscanf) return已成功匹配和分配的输入项的数量。 返回值不包括已执行但未分配的转换(例如,抑制分配)。

如果您检查项目数量计数,在某些情况下可能会变为假。