如果在char数组之间遇到空格,strlen会做什么?

时间:2018-03-14 11:20:13

标签: c++ strlen

#include<iostream>
#include<string.h>

using namespace std;

int main() {
    char b[] = {'a','b',' ','c'};
    cout << sizeof(b) << endl;
    cout << strlen(b) << endl;
    return 0;
}

为什么上面的输出是4,6不是4,4是正确的答案?

4 个答案:

答案 0 :(得分:5)

代码的行为未定义:strlen要求b 必须在数组范围内包含NUL字符。

(请注意,' '是一个空格,不是 NULstrlen对任何其他非NUL空格的处理方式不同。char b[5]={'a','b',' ','c'}; } character。)

如果你写过

b

然后C ++会将NUL的最后一个元素设置为0(即<select id='dropdown1' name='branch'> <option value='it'>IT</option> <option value='entertainment'>Entertainment</option> </select> <select id='dropdown2' name='branch-sub' style='display:none;'></select> )。

答案 1 :(得分:1)

您的代码展示未定义的行为

如果传递给它的参数不是strlen,则NUL的行为未被定义。

您似乎将NUL角色与空格角色混淆。

答案 2 :(得分:0)

strlen遍历数组直到遇到NULL个字符。您的数组不包含NULL个字符(ASCII 0),但它包含一个空格(ASCII 32)。

所以strlen继续过去你的数组。它碰巧在位置6处存在NULL字符(在内存中数组末尾之后的两个字符),因此字符串长度为6.此函数的后续执行可能返回不同的值,因为数组外部的内存内容是未定义。它也可能崩溃。

答案 3 :(得分:0)

  

如果strlen在char数组之间找到一个空格,它会做什么?

虽然所有其他答案(根据您的代码示例,合法!!!)由于数组中缺少空字符而暗示未定义的行为,但我将回答您的原始问题:

没什么特别的,它会像任何其他角色一样计算空间(特别是不会停止处理字符串,就像你想象的那样)......