因此,我对以下解释感到好奇,如果我在printf部分使用%s,为什么我的代码会得到不同的结果。我知道工作的人应该使用%s代替%c。
#include <stdio.h>
int main() {
int i;
char str1[12] = "Hello world!";
printf("str1==%c\n", str1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我尝试多次编译它,并且在两次之间得到一些不同的结果:str1 == ?、 str1 ==,str1 ==(此空白实际上是该站点无法显示的某些图标)
str1char*在这种情况下衰减到a 。随着%c你告诉printf,这是一个char它是不是。指定错误的格式是未定义的行为,因此无法保证会发生什么(它可能会使程序崩溃,甚至导致更糟糕的事情发生)。最有可能发生的情况是,它试图将指针解释为char,这可能导致无法打印的符号。
这里
printf("str1==%c\n", str1);
Run Code Online (Sandbox Code Playgroud)
格式说明符%c期望char类型为参数,但提供的参数str1为char数组,并且char*类型会衰减为类型,编译器应已报告警告消息,如果可以使用标记进行编译,则好像您已忽略该警告消息-Wall。用下面的最小标志编译代码是很好的
gcc -Wall -Wextra -Werror -pedantic test.c
Run Code Online (Sandbox Code Playgroud)
警告:格式指定类型,
'int'但参数具有类型'char *' [-Wformat]
使用%s代替%c。
printf("str1==%s\n", str1);
Run Code Online (Sandbox Code Playgroud)