据我所知,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)
请注意,当您声明字符数组并逐个初始化它们的元素时,您需要从第一个字符开始连续提供字符的值,并且最后一个字符应该被赋予空'\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函数正确解释,并会产生意外结果.