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


#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是正确的答案吗?

代码的行为是未定义的:strlen要求b必须在数组的边界内包含一个NUL字符。

(请注意,' '是一个空格,而不是NUL。空格的处理方式与任何其他非NUL字符strlen没有区别。

如果你写过

char b[5]={'a','b',' ','c'};

那么C++会将 b 的最后一个元素设置为 0(即 NUL (为你。

如果 strlen 在字符数组之间设置一个空格,它会怎么做?

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

没什么特别的,它会像任何其他字符一样计算空格(特别是,它不会像您假设的那样停止处理字符串(......

您的代码表现出未定义的行为

如果传递给strlen的参数未NUL终止,则不会定义的行为。

您似乎将 NUL 字符与空格字符混淆了。

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

因此,strlen继续通过您的阵列。它恰好在位置 6(内存中数组末尾后面的两个字符(存在一个NULL字符,因此字符串长度为 6。此函数的后续执行可能会返回不同的值,因为数组外部的内存内容未定义。它也可能会崩溃。

相关内容

最新更新