根据我的知识和类似这样的线程,如果要在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占位符在没有我给它的情况下就获得了价值,它又如何知道赋予它的价值?
这是未定义的行为,任何可能发生的事情,包括看起来正确的事情,都可能发生。但这是不正确的。如果使用正确的选项,编译器可能会告诉您问题。
标准说(强调是我的):
7.21.6.1 fprintf函数
- fprintf函数在格式所指向的字符串的控制下将输出写入流所指向的流,该字符串指定了如何转换后续参数以进行输出。如果没有足够的参数用于格式,则行为未定义。如果在保留参数的同时用尽了格式,则会对多余的参数进行评估(一如既往),否则将被忽略。当遇到格式字符串的结尾时,fprintf函数将返回。