【问题标题】:Count length of string in C without using string.h library (using char pointers)在不使用 string.h 库的情况下计算 C 中字符串的长度(使用 char 指针)
【发布时间】:2021-03-25 00:49:06
【问题描述】:

我需要在不使用 string.h 库的情况下使用 char 指针来计算 C 中字符串的长度。到目前为止,我看到的所有方法都使用 string.h 库。没有i也可以吗?

【问题讨论】:

标签: c pointers


【解决方案1】:

这里的例子:

size_t pos(char* s)
{
    size_t lenS; //len of string

    for (lenS = 0; s[lenS]; lenS++);

    return lenS;
}

【讨论】:

  • 字符串长度超过int范围时失败。
  • @chux-ReinstateMonica:怀疑这很重要。这可能是家庭作业,如果不是,那么它必须是足够嵌入的东西,其中超过 int 范围的字符串是不合理的。
  • intsize_t 的大小不同时,打印len()strlen() 的结果需要不同的打印说明符,即使字符串长度为1。当为strlen( ) 替换,使用相同的函数签名最有意义。 size_t strlen(const char *s); 而不是更改参数的类型并返回。
【解决方案2】:

是的,这是可能的,C 中字符串的结尾通常以 null 结尾,因此您可以循环遍历字符串,直到找到 '\0' 字符,然后计算每个字符。

【讨论】:

    【解决方案3】:

    在 C 语言中谈论字符串时,您实质上是在谈论由 nil 字符 ('\0') 终止的 char 数组。因此,字符串的长度为:

    size_t len(const char *s) {
        // if no string was passed (null pointer), just return
        if (s == NULL)
            return 0;
    
        size_t ln;
        // iterate over string until you encounter the terminating char
        for (ln=0;s[ln] != '\0'; ln++);
    
        return ln;
    }
    

    正如@chux-ReinstateMonica 所指出的:这里返回的正确类型是size_t,如果您想避免潜在的溢出问题+ 您正在寻找@ 中strlen() 函数的直接替代品987654327@。毕竟,字符串的长度永远不会是负数,因此使用无符号的size_t 比有符号的int 更有意义。

    现在这显然假设输入是一个有效的字符串。如果我要这样做:

    int main( void ) {
        char * random = malloc(1024); // allocate 1k chars, without initialising memory
        printf("length is: %zu\n", len(random)); // use %zu because size_t is unsigned!
        return 0;
    }
    

    无法保证我分配的内存甚至包含终止字符,因此函数返回大于 1024 的值并非不可能。类似的情况也是如此:

    char foo[3] = {'f', 'o', 'o'}; // full array, no terminating char
    

    这个字符串在内存中可能看起来像这样:

    //the string - random memory after the array
    | f | o | o | g | a | r | b | a | g | e | U | B | \0 |
    

    使它看起来像一个 12 个字符的字符串。如果您随后使用假定的 12 长度来写入实际数组,则所有赌注都将关闭(未定义的行为)。

    这个字符串应该是:

    char foo[4] = {'f', 'o', 'o', '\0'}; // or char[4] foo = "foo";
    

    您可以阅读我在其他地方给出的旧答案,了解有关如何获取传递给函数 here 的字符串长度的更多详细信息

    【讨论】:

    • 当字符串长度超过int 范围时失败。此len()strlen() 的返回类型不匹配。 printf("length is: %d\n", len(random)); 之类的代码在 len()strlen() 之间切换时需要更多维护,以调整打印说明符。使用size_t 比使用int 可以解决这些问题。
    • @chux-ReinstateMonica:你说得对,我相信我在底部链接的答案中实际上提到了使用size_t。不过会在这里更新代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2020-11-07
    • 1970-01-01
    • 2022-01-15
    • 2014-04-23
    • 2014-05-20
    • 1970-01-01
    相关资源
    最近更新 更多