字符串比C中的预期长

这是我的代码

#include  #include  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和@之间的另一个不可打印的字符。 我是个菜鸟,所以也许我错过了一些明显的东西。 有人能帮我吗?

编辑:

只需给一个额外的空间,比如char pal [9] =“ciaooaic”; char pal1 [8] =“ciaoaic”;

它有效,但为什么呢? 我明白应该有\ 0的空间,但“ciaoaic”没有它的工作……

1.当你将它们传递给strlen() ,不要为null终止符留空格,因此你的代码表现出未定义的行为

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

'\0'留一个空格。 像这样声明和初始化 –

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

2. strlen()返回size_t而不是int ,所以这样写 –

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

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

您没有为NULL终止字符\0保留空间。


将数组的大小增加1

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

要么

不要指定长度

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

上述答案都足以解决您的疑虑。 将pal和pal1的长度都增加1,因为在末尾没有空格分配空字符(’\ 0’)。 但是,使用printf打印非null终止字符有一个小技巧

 printf("strlen('%.*s'): %d\n",8, pal, lenPal); printf("strlen('%.*s'): %d\n",7, pal1, lenPal1); 

链接上面的技巧: BRILLIANT