为什么strlen不适合我?

时间:2010-04-09 16:26:03

标签: c++ string

char p[4]={'h','g','y'};
cout<<strlen(p);

此代码打印3。

char p[3]={'h','g','y'};
cout<<strlen(p);

这打印8。

char p[]={'h','g','y'};
cout<<strlen(p);

再次打印8。

请帮助我,因为我无法弄清楚为什么通过改变阵列的大小来打印三个不同的值。

7 个答案:

答案 0 :(得分:27)

strlen从给定指针开始并前进,直到到达字符'\0'。如果您的数组中没有'\0',则可能任何数字,直到达到'\0'

达到您要查找的数字的另一种方法(在您显示的情况下)是使用:int length = sizeof(p)/sizeof(*p);,它将为您提供数组的长度。但是,这并不是strlen定义的字符串长度。

正如@John Dibling所提到的,strlen给出第一个例子的正确结果的原因是你为4个字符分配了空间,但只使用了3个字符;剩下的1个字符会自动初始化为0,这正是'\0'寻找的strlen字符。

答案 1 :(得分:4)

只有你的第一个例子有一个空终止的字符数组 - 另外两个例子没有空终止,所以你不能以明确定义的方式对它们使用strlen()

char p[4]={'h','g','y'}; // p[3] is implicitly initialized to '\0'

char p[3]={'h','g','y'}; // no room in p[] for a '\0' terminator

char p[]={'h','g','y'};  // p[] implicitly sized to 3 - also no room for '\0'

请注意,在最后一种情况下,如果您使用字符串文字初始化数组,则会得到一个空终止符:

char p[]= "hgy";  // p[] has 4 elements, last one is '\0'

答案 2 :(得分:1)

那会给你一个随机数。 strlen要求字符串以'\0'终止才能生效。

答案 3 :(得分:1)

试试这个:

char p[4]={'h','g','y', '\0'};

答案 4 :(得分:1)

strlen是一个标准库函数,可以与字符串一起使用(在术语的C意义上)。 String 定义为char值的数组,以\0值结尾。如果您向<{1}}提供的内容不是字符串,则行为未定义:代码可能会崩溃,代码可能会产生无意义的结果等。

在您的示例中,只有第一个提供带有字符串strlen,这就是它按预期工作的原因。在第二种情况和第三种情况下,您提供的不是字符串(不以strlen结尾),这就是为什么结果没有意义。

答案 5 :(得分:0)

'\0'终止你的char缓冲区。

char p[4]={'h','g','y', '\0'};

答案 6 :(得分:0)

这是因为strlen()希望为字符串找到一个空终止符。在这种情况下,您没有它,因此strlen()会一直计数,直到找到\ 0或者提供内存访问冲突并且您的程序死亡。 RIP!