在 sscanf 中使用格式参数作为附加参数是否安全?

Is it safe to use format parameter as additional argument in sscanf?

下面的代码可以安全使用吗?我的意思是,如果模式可能在一个循环中被扫描和覆盖,或者这种冲突从未发生,或者它是否依赖于实现。

char pattern[32] = "%31s";
sscanf("hello",pattern,pattern);

我没有找到任何关于 here nor here 的注释。

(用例:有时我使用 pattern 作为临时缓冲区。)

C11 标准 (ISO/IEC 9899:2011) 涵盖了这一点。它说:

7.21.6.7 The sscanf function

int sscanf(const char * restrict s, const char * restrict format, ...);

restrict表示格式不能与任何参数相同。

描述说:

If copying takes place between objects that overlap, the behavior is undefined.

你想做的是 'undefined behaviour'。不要那样做。