搜索

首页  >  问答  >  正文

C++中数组strlen

char a[] = {'a','b','c'};
cout << strlen(a) << endl;
输出 6

char a[3] = {'a','b','c'};
cout << strlen(a) << endl;
输出 6

char a[4] = {'a','b','c'};
cout << strlen(a) << endl;
输出 3

strlen 会一直往前找直到找到'\0',但是为什么第一第二个会返回 6 呢?
黄舟黄舟2766 天前538

全部回复(4)我来回复

  • 迷茫

    迷茫2017-04-17 15:06:59

    对无 结尾的字符串调用 strlen 是未定义行为。

    回复
    0
  • 怪我咯

    怪我咯2017-04-17 15:06:59

    先分析您的代码:

    雷雷

    进一步理解

    雷雷 雷雷

    strlen 说明

    获取字符串长度

    返回 C 字符串 str 的长度。

    C 字符串的长度由终止空字符决定:C 字符串的长度等于字符串开头和终止空字符之间的字符数(不包括终止空字符本身)。

    这不应该与保存字符串的数组的大小混淆。例如:

    char mystr[100]="测试字符串";

    定义了一个大小为100个字符的字符数组,但是初始化mystr的C字符串的长度只有11个字符。因此,虽然 sizeof(mystr) 的计算结果为 100,但 strlen(mystr) 返回 11。

    回复
    0
  • ringa_lee

    ringa_lee2017-04-17 15:06:59

    字符数组是字符数组,字符串是字符串。只有字符串才有 ,字符数组没这待遇。这三个代码片段输出的结果,应该都是随机值——恰好从 a 开始偏移的那段内存中有个数据让 strlen 误认为是 ,于是它就返回了自己读到的字节数。

    被踩了一下……可能踩我的人认为,当数组的长度大于字符串实际长度时,编译器会自动在字符串末尾添加 。事实上,这依赖于编译器的具体实现,C 标准中对此没有什么说法。

    回复
    0
  • 高洛峰

    高洛峰2017-04-17 15:06:59

    雷雷

    回复
    0
  • 取消回复