【问题标题】:strlen an array has different resultstrlen 数组有不同的结果
【发布时间】:2014-10-27 23:12:32
【问题描述】:
unsigned char kk[16] = {129, 254, 139, 254, 135, 87, 108, 62, 203, 34, 66, 111, 142, 87, 132, 115};
unsigned char kkf[20] = {24, 165, 227, 127, 183, 90, 60, 22, 128, 165, 7, 52, 151, 238, 69, 203, 42, 213, 220, 57};
printf("strlen kk: %d\n", strlen(kk)); //should be 16
printf("strlen kkf: %d\n", strlen(kkf) //should be 20

输出是

strlen kk: 16
strlen kkf: 22 //insane????????

为什么kkf[20]的长度是22?明显是20吗?我在Linux上编译它。发生了什么?提前致谢。

【问题讨论】:

  • 您滥用了strlen 并调用了未定义的行为。它用于测量 strings(NUL 终止字符序列)的长度,而不是任意数组。

标签: c arrays linux char strlen


【解决方案1】:

C 字符串以零结尾,这意味着您需要在每个数组的末尾有一个零字符。将代码更改为:

unsigned char kk[17]  = {129, 254, 139, 254, 135, 87, 108,  62,
                         203,  34,  66, 111, 142, 87, 132, 115, 0};
unsigned char kkf[21] = { 24, 165, 227, 127, 183, 90,  60,  22,
                         128, 165,   7,  52, 151, 238, 69, 203,
                          42, 213, 220,  57,   0};
printf("strlen kk: %d\n", strlen(kk)); //should be 16
printf("strlen kkf: %d\n", strlen(kkf) //should be 20

在您的原始代码的情况下,您对第一个数组很幸运,它恰好在由文字创建的最后一个元素之后有一个零字符。

分享和享受。

【讨论】:

  • 也许是unsigned char kk[]
  • @chux:如果要将数组视为字符串,则仍需要零字符作为终止符。
  • 更清楚:建议unsigned char kk[] 而不是unsigned char kk[17]。在任何一种情况下,数组都应该以空字符结束以使其成为字符串。
【解决方案2】:

strlen() 对字符进行计数,直到找到您未提供的“\0”。碰巧有一个 '\0' 值,距离 kk 结尾 16 个字节,距离 kkf 结尾 22 个字节,但这纯属偶然。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2019-02-24
    • 1970-01-01
    • 2017-12-19
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多