在C语言中,为什么%s没有给出值就可以工作?

Tam*_*bul 3 c

根据我的知识和类似这样的线程,如果要在C中打印字符串,则必须执行以下操作:

printf("%s some text", value);
Run Code Online (Sandbox Code Playgroud)

并且将显示值而不是%s

我写了这段代码:

char password[] = "default";
printf("Enter name: \n");
scanf("%s", password);
printf("%s is your password", password); // All good - the print is as expected
Run Code Online (Sandbox Code Playgroud)

但是我注意到,没有价值部分,我可以做完全相同的事情,它仍然可以工作:

printf("%s is your password");
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,为什么%s占位符在没有我给它的情况下就获得了价值,它又如何知道赋予它的价值?

Jea*_*nès 9

这是未定义的行为,任何可能发生的事情,包括看起来正确的事情,都可能发生。但这不正确的。如果使用正确的选项,编译器可能会告诉您问题。

标准说(强调是我的):

7.21.6.1 fprintf函数

  1. fprintf函数在格式所指向的字符串的控制下将输出写入流所指向的流,该字符串指定了如何转换后续参数以进行输出。如果没有足够的参数用于格式,则行为未定义。如果在保留参数的同时用尽了格式,则会对多余的参数进行评估(一如既往),否则将被忽略。当遇到格式字符串的结尾时,fprintf函数将返回。

  • 至于为什么它可能恰好显示了正确的密码:函数scanf和printf都使用一个常量字符串和password作为参数。因此,如果来自`scanf`的`password`仍在`printf`期望其第二个参数的空间中,则`printf`将会碰巧找到要为%s`打印的“正确”值。 (2认同)