在下面的代码中,fizz打印正确,但是buzz没有。在这里使用char数组或使用错误的方式有什么问题?
#include <stdio.h>
int main() {
int i;
char *fizz = "fizz";
char buzz[4] = "buzz";
for(i = 1; i <= 100; i++) {
if(!((i %3 == 0) || (i%5 == 0)))
printf("%d", i);
if(i%3 == 0)
printf("%s", fizz);
if(i%5 == 0)
printf("%s", buzz);
printf("\n");
}
}
答案 0 :(得分:6)
两个字符串实际上都不是四个字节。 C字符串是 NUL终止的,所以它们总是以字符长度加上'\0'
字符的长度。因此,您应该更改buzz
的声明,如下所示:
char buzz[5] = "buzz";
但是,还要注意,不需要在使用字符串文字初始化时明确声明变量的长度。你可以省略号码,它会正常工作。
char buzz[] = "buzz";
答案 1 :(得分:3)
%s
说明符打印字符串。字符串是一系列字符后跟一个空终止符。换句话说,你告诉printf
你的角色在哪里开始,printf
一直打印,直到遇到空终结符。
"buzz"
表达式是一个以空字符结尾的字符串,但是你把它变成了char buzz[4]
,所以null终止符不合适。结果是buzz
数组不包含空终止符,因此printf
读取字符串的结尾,从而导致未定义的行为。要解决这个问题:
char buzz[] = "buzz";
将包含一个空终止符并分配适当的空间量。
答案 2 :(得分:3)
您已将buzz数组的大小声明为4,并且包含\0
字符串的大小为5.因此您必须将buzz数组的大小更改为5,或者不要提及大小
char buzz[5] = "buzz";
因为buzz不是指针变量,如果buzz是指针变量,它将根据字符串分配内存,因此不需要指定大小。
由于buzz是一个数组,你必须正确地提到它的大小。
在打印时我们使用%s
,%s
将打印字符串,直到出现\ 0字符。
在buzz字符串中没有\ 0字符,这就是问题。
答案 3 :(得分:2)
buzz包含4个字符,它没有为空字符保留空间,因此无法使用%s正确打印。 %s指定要打印的以空字符结尾的字符串,如果字符串未终止,则无法正常工作。
将初始化更改为char buzz[] = "buzz"