字符串比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