这是我的代码
#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和@之间还有另一个不可打印的字符。我是一个菜鸟,所以也许我错过了一些明显的东西。有人能帮助我吗?
编辑:
只需给一个额外的空间,比如char pal [9] =&#34; ciaooaic&#34 ;; char pal1 [8] =&#34; ciaoaic&#34 ;;
它有效,但为什么?我明白应该有\ 0的空间,但是&#34; ciaoaic&#34;没有它工作......
答案 0 :(得分:4)
1。当您将空格传递给strlen()
时,您不会为空终止符留空格,因此您的代码会显示未定义的行为 - < / p>
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
说明符打印这两个变量。
答案 1 :(得分:2)
您没有为NULL终止字符\0
保留空间。
将数组的大小增加1
char pal[9] = "ciaooaic";
char pal1[8] = "ciaoaic";
OR
不要指定长度
char pal[] = "ciaooaic";
char pal1[] = "ciaoaic";
答案 2 :(得分:0)
上述答案都足以解决您的疑虑。 将pal和pal1的长度都增加1,因为在末尾没有空格来分配空字符(&#39; \ 0&#39;)。 但是,使用printf
打印非null终止字符有一个小技巧printf("strlen('%.*s'): %d\n",8, pal, lenPal);
printf("strlen('%.*s'): %d\n",7, pal1, lenPal1);
上述技巧的链接:BRILLIANT