为什么我使用fprintf会出现不一致的行为?

emi*_*ir0 2 c string

据我所知,fprintf将一个字符数组的指针作为参数,并打印出来.我不知道"什么时候"它会停止.请看以下示例:

假设:print_s

void print_s(const char* s) {
    fprintf(stdout,"%s",s);
}
Run Code Online (Sandbox Code Playgroud)

例1:

char c[6];
c[0] = 'a';
c[1] = 'b';
c[2] = 'c';
c[3] = 'd';
c[4] = 'e';
print_s((char*) c);
Run Code Online (Sandbox Code Playgroud)

输出:

abcd // e not printed!
Run Code Online (Sandbox Code Playgroud)

例2:

char c[6];
c[0] = 'a';
c[1] = 'b';
c[2] = 'c';
c[3] = 'd';
c[4] = 'e';
c[5] = 'b';
print_s((char*) c);
Run Code Online (Sandbox Code Playgroud)

输出:

abcdb // works as expected
Run Code Online (Sandbox Code Playgroud)

例3:

char c[6];
c[0] = 'a';
c[2] = 'c';
c[3] = 'd';
c[4] = 'e';
print_s((char*) c);
Run Code Online (Sandbox Code Playgroud)

输出:

a<someGarbage>cd // works as expected
Run Code Online (Sandbox Code Playgroud)

例4:

char c[6];
c[0] = 'a';
c[1] = 'b';
c[2] = 'c';
c[3] = 'd';
c[4] = 'e';
c[5] = '\0';
print_s((char*) c);
Run Code Online (Sandbox Code Playgroud)

输出:

abcde // works as expected
Run Code Online (Sandbox Code Playgroud)

skr*_*ngr 6

请注意,当您声明字符数组并逐个初始化它们的元素时,您需要从第一个字符开始连续提供字符的值,并且最后一个字符应该被赋予空'\0'值.

例:

char a[6];
a[0]='a';
a[1]='b';
a[2]='c';
a[3]='d';
a[4]='\0';
Run Code Online (Sandbox Code Playgroud)

这会将数组声明a为字符串"abcd".

如果您无法以类似的方式初始化,则您的字符串很容易获得垃圾字符值,这些值无法被任何I/O函数正确解释,并会产生意外结果.