0

我对 C 编程很陌生,所以请随时纠正我,我坚持。我对 C 中的字符串的基本理解是,当我们初始化一个字符串时,会在字符串的末尾自动分配一个空字符,并且空字符不能读取或写入,而是仅在内部使用。

因此,当我创建一个大小为 4 as 的字符串char str[3]并为其分配一个单词“RED”并使用 puts 函数或打印它时printf("%s",str),我得到一个不寻常的输出打印为RED(SMIILEY FACE)

然后我再次减小字符串的大小char str[2]并将 RED 分配给它,然后编译它并再次收到一个输出说明RE(Smiley face)

如果有人可以向我解释,我将不胜感激。在下面发布C代码

    int main()
{

 char s1[3]="RED";
 char s2[]="RED";
 puts(s1);
 puts(s2);
 printf("%s",s1);
 return 0;
}
4

2 回答 2

4
char s1[3] = "RED";

是一个有效的陈述。它将常量字符串文字(长度为 4 个字符)中的3 个"RED"字符复制到字符数组s1中。没有终止'\0's1因为没有空间。

注意副本,因为s1是可变的,而"RED"不是。这使得语句不同于 eg const char *s1 = "RED";,其中复制字符串。

puts(s1)两者的结果printf("%s", s1)都是未定义的。没有终止'\0's1将其视为带有 one 的字符串可能会导致任意行为。

char s2[] = "RED";

这里,,sizeof(s2) == 4因为有四个字符,所以计算空格"RED"的时候需要算尾数。'\0'

于 2015-11-21T10:30:50.367 回答
3

空字符占用一个额外字符(字节)。因此,除了要初始化的单词中的字符数之外,您还需要使用额外的空格。

 char s1[4]="RED"; //3 for RED and 1 for the null character

另一方面

char s2[3]="RED";

空字符没有空格。“RED”在那里,但在打印它时会遇到 I/O 问题,因为最后没有存储空字符。printf您的数据存储良好,但由于没有空字符,因此无法正确识别。

 char s2[]="RED";

这将作为 4(字节)的内存自动分配,其中包括终止空字符的空间。

于 2015-11-21T10:22:45.823 回答