#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是正确的答案?
答案 0 :(得分:5)
代码的行为未定义:strlen
要求b
必须在数组范围内包含NUL
字符。
(请注意,' '
是一个空格,不是 NUL
。strlen
对任何其他非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数组之间找到一个空格,它会做什么?
虽然所有其他答案(根据您的代码示例,合法!!!)由于数组中缺少空字符而暗示未定义的行为,但我将回答您的原始问题:
没什么特别的,它会像任何其他角色一样计算空间(特别是不会停止处理字符串,就像你想象的那样)......