在下面的代码中,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");
}
}
这两个字符串实际上都没有四个字节长。C 字符串以 NUL 结尾,因此它们始终是字符长度加上 1 表示' '
字符。因此,您应该更改buzz
的声明,如下所示:
char buzz[5] = "buzz";
但是,另请注意,在使用字符串文本初始化时,不需要显式声明变量的长度。您可以省略该数字,它将正常工作。
char buzz[] = "buzz";
%s
说明符打印一个字符串。字符串是一系列字符,后跟一个 null 终止符。换句话说,你告诉printf
你的字符从哪里开始,printf
继续打印,直到遇到空终止符。
"buzz"
表达式是以 null 结尾的字符串,但是您将其硬塞进char buzz[4]
,因此 null 终止符不适合。结果是 buzz
数组不包含 null 终止符,因此printf
读取字符串的末尾,从而导致未定义的行为。要修复此问题,请写入:
char buzz[] = "buzz";
这将包括一个空终止符并分配适量的空间。
您已将 buzz 数组的大小声明为 4,包括字符串的大小