如果我在代码的printf部分中使用%s代替%c,则代码背后的解释

Sya*_*uqi 2 c c++ printf

因此,我对以下解释感到好奇,如果我在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 ==(此空白实际上是该站点无法显示的某些图标)

Bla*_*aze 7

str1char*在这种情况下衰减到a 。随着%c你告诉printf,这是一个char它是不是。指定错误的格式是未定义的行为,因此无法保证会发生什么(它可能会使程序崩溃,甚至导致更糟糕的事情发生)。最有可能发生的情况是,它试图将指针解释为char,这可能导致无法打印的符号。


Ach*_*hal 5

这里

printf("str1==%c\n", str1);
Run Code Online (Sandbox Code Playgroud)

格式说明符%c期望char类型为参数,但提供的参数str1char数组,并且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)