C语言 指向字符和字符数组的指针用法之间的差异



在下面的代码中,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,包括字符串的大小为 5。 因此,您必须将 buzz 数组的大小更改为 5,或者不要提及大小。

char buzz[5] = "buzz";
因为 buzz 不是指针变量,

如果 buzz 是指针变量,它会根据字符串分配内存,所以不需要指定大小。由于嗡嗡声是一个数组,因此您必须正确提及大小。在打印时我们使用 %s%s将打印字符串直到出现 \0 字符。在嗡嗡声字符串中没有\0字符,这就是问题所在。

buzz 包含 4 个字符,它没有为空字符保留的空间,因此无法使用 %s 正确打印。 %s 指定要打印的以空结尾的字符串,如果字符串不是以空结尾的,则无法正常工作。

将初始化更改为char buzz[] = "buzz"

最新更新