【问题标题】:Alternative to strlen not breaking on 0 [duplicate]替代 strlen 不中断 0 [重复]
【发布时间】:2019-03-28 02:17:37
【问题描述】:

有没有更好的方法来获得正确长度的包含数字的数组?

我有一个数字数组:0, 0, 1,我尝试获取它的长度。它显然会中断并返回0。我是C 的新手,但我尝试自定义strlen 函数:

int custom_strlen(char *str) {
    for(int i = 1; ;i++) {
        if (str[i] == 0) {
            return i;
        }
    }
    return -47;
}

但它不是那么有效,并且在某些情况下还会返回意外的值。在这种情况下,预期输出为 3。

有什么功能可以用吗?

【问题讨论】:

  • 如果不使用哨兵(即:非数字值),则无法做到这一点,(您不知道何时停止)
  • 如果它不是以 NUL 结尾的字符串,则不能在其上运行 strlen。你是如何终止这个“数字数组”的?
  • 不,如果数组的任何位置都可能包含零,那么它就不是C字符串,不能使用任何字符串函数。
  • 请创建一个 MCVE (minimal reproducible example)。如果我们能看到足够多的代码,它将解决各种“whaddya mean by ...”问题。为什么开始查看数组索引1 而不是0? C 中的数组从 0 开始索引,而不是 1。您的代码将在空字符串上失败(或者,更确切地说,由于访问字符串末尾之外的数据的未定义行为而返回不可预测的长度)。
  • 这个“数字数组”的内容究竟是什么?表示二进制数的常用方法是使用'0''1',而不是01。如果您这样做,您可以使用预定义的strlen 函数。您的函数和标准 strlen 都必须假设数组中某处有一个终止 '\0'

标签: c arrays string-length


【解决方案1】:

整数数组不是字符串。 C 数组本身不包含长度信息。 strlen 的工作方式是 C 字符串以 null 终止,这意味着最后一个字符是 NUL(空字符),即 0。否则,就无法知道一个多长时间数组是。

我想你可能想做一个'0','0','1' 的数组。你能把你正在使用的数组贴出来吗?

【讨论】:

  • 谢谢,已编辑。我在想C宏NULL
  • 请使用 cmets 澄清问题。在问题足够清楚可以回答之前不要回答。
  • 啊,是的,我的错。
【解决方案2】:

如前所述,C 字符串是空终止的。

唯一的选择是

  • 使用以您要注意的某些特殊字符(如 null)或
  • 结尾的字符串
  • 在创建字符串时跟踪它的长度。

FWIW,如果它不是以 null 结尾的,那么它实际上不是 C 中的字符串,它只是包含您碰巧被解释为字符串的字符的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2020-05-09
    • 1970-01-01
    相关资源
    最近更新 更多