字符串比 C 语言中预期的要长

String is longer than expected in C

这是我的代码

#include <stdio.h>
#include <string.h>

int main(){
    char pal[8] = "ciaooaic";
    char pal1[7] = "ciaoaic";
    int lenPal = strlen(pal);
    int lenPal1 = strlen(pal1);
    printf("strlen('%s'): %d\n", pal, lenPal);
    printf("strlen('%s'): %d\n", pal1, lenPal1);
    return 0;
}

问题是当我 运行 这段代码的输出是:

strlen('ciaooaicP@'): 11
strlen('ciaoaic'): 7

第一个字符串在 P 和 @ 之间还有另一个不可打印的字符。我是菜鸟,所以也许我错过了一些明显的东西。有人可以帮助我吗?

编辑:

just give one extra space like char pal[9] = "ciaooaic"; char pal1[8] = "ciaoaic";

它有效,但为什么呢?我知道 \0 应该有一个 space,但是 "ciaoaic" 没有它也能工作...

您没有为 NULL 终止字符 [=12=] 保留 space。


要么将数组的大小增加 1

char pal[9] = "ciaooaic";
char pal1[8] = "ciaoaic";

完全不指定长度

char pal[] = "ciaooaic";
char pal1[] = "ciaoaic";

1. 您没有为空终止符留出空间,因为您将它们传递给 strlen(),因此您的代码表现出 未定义的行为-

char pal[8] = "ciaooaic";
char pal1[7] = "ciaoaic";

'[=14=]'留一个space。像这样声明和初始化 -

char pal[9] = "ciaooaic";
char pal1[8] = "ciaoaic";

2.strlen() returns size_t 而不是 int ,所以这样写 -

size_t lenPal = strlen(pal);
size_t lenPal1 = strlen(pal1);

并使用 %zu 说明符打印这两个变量。

以上两个答案足以解决你的疑惑。 将 pal 和 pal1 的长度都增加一,因为末尾没有 space 用于分配空字符 ('\0')。 但是有一个小技巧可以使用 printf

打印非空终止字符
printf("strlen('%.*s'): %d\n",8, pal, lenPal);
printf("strlen('%.*s'): %d\n",7, pal1, lenPal1);

Link 上面的技巧:BRILLIANT