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

时间:2016-11-16 21:33:14

标签: c string

据我所知,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

2 个答案:

答案 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可能会得到不同的结果。