据我所知,fprintf
将一个字符数组的指针作为参数,并打印出来。我不知道"什么时候"但它停了下来。请看以下示例:
假设:print_s
是
void print_s(const char* s) {
fprintf(stdout,"%s",s);
}
示例1:
char c[6];
c[0] = 'a';
c[1] = 'b';
c[2] = 'c';
c[3] = 'd';
c[4] = 'e';
print_s((char*) c);
输出:
abcd // e not printed!
示例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);
输出:
abcdb // works as expected
示例3:
char c[6];
c[0] = 'a';
c[2] = 'c';
c[3] = 'd';
c[4] = 'e';
print_s((char*) c);
输出:
a<someGarbage>cd // works as expected
示例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);
输出:
abcde // works as expected
答案 0 :(得分:6)
请注意,当您声明字符数组并逐个初始化它们时,您需要从第一个字符开始不断地为字符提供值,并且最后一个字符应该为空'\0'
值。
示例:
char a[6];
a[0]='a';
a[1]='b';
a[2]='c';
a[3]='d';
a[4]='\0';
这会将数组a
声明为字符串"abcd"
。
如果您无法以类似的方式初始化,则您的字符串很容易获得垃圾字符值,这些值无法被任何I / O函数正确解释,并会产生意外结果。
答案 1 :(得分:0)
章节'7.19.6.1我查看的ISO/IEC 9899 C standard的fprintf函数8(s)',页面280的顶部有关于由pm2 start app.js
打印的字符串的以下内容(使用{ {1}}格式说明符):
数组中的字符被写入(但不包括)终止空字符。如果 指定精度,不超过写入的多个字节。 如果 精度未指定或大于数组的大小,数组应 包含空字符(强调我的)。
如果NUL终止符不存在,即使您注意到'预期'的行为也未指定。您看到的行为取决于编译器的实现以及运行代码的系统的实现。在不同的系统上或使用不同的编译器,您的示例1-3可能会得到不同的结果。