为什么此函数返回正确的字符串长度?(增加一个char指针)

这是一个计算字符串中字符数的函数:

int str_len(const char* s) {
    int i = 0;
    while(*(s++)) {
        i++;
    }
    return i;
}

为什么返回正确的长度?

假设我使用简单的String调用此函数"a"然后s递增在while循环,因此值si均为0。

chqrlie

的值s++是的原始值s,在递增之前,递增发生在下一个序列点之前的未指定时间。

因此*s++*(s++)是等效的:它们都取消引用的原始值s另一个等效的表达是*(0, s++),而不是因为胆小的人,这是这样的:0[s++]

但是请注意,您的函数应将typesize_t用于i及其返回类型:

size_t str_len(const char *s) {
    size_t i = 0;
    while (*s++) {
        i++;
    }
    /* s points after the null terminator */
    return i;
}

这是一个可能更有效的版本,每个循环只有一个增量:

size_t str_len(const char *s) {
    const char *s0 = s;
    while (*s++) {
        /* nothing */
    }
    return s - 1 - s0;
}

对于那些对第二段中的怪异表情感到疑惑的人:

  • 0, s++是逗号运算符的实例,该运算符先,评估其左侧部分,然后评估其右侧部分,以构成其值。因此(0, s++)等于(s++)

  • 0[s++]等于(s++)[0]*(0 + s++)*(s++ + 0)简化为*(s++)[]表达式中转置指针和索引表达式不是很普遍,也不是特别有用,但符合C标准。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果可以给函数一个char *或文字字符串,那么声明此函数的正确方法是什么?

来自分类Dev

一个char指针函数在函数内部返回字符串,但在main函数中返回字符串?

来自分类Dev

为什么此javascript字符串匹配调用仅返回一个结果?

来自分类Dev

为什么我的函数返回一个空字符串?

来自分类Dev

为什么打印指向char的指针的第一个元素会打印字符串的内容?

来自分类Dev

为什么取消引用指向字符串(char数组)的指针会返回整个字符串,而不是第一个字符?

来自分类Dev

为什么此函数返回''而不是串联字符串

来自分类Dev

为什么此函数返回''而不是串联字符串

来自分类Dev

一个带有字符串参数并返回整数指针的函数

来自分类Dev

为什么这个C ++字符串长度计算功能比另一个更快?

来自分类Dev

为什么在for循环中第二次运行函数会返回一个空字符串?

来自分类Dev

当我将一个char添加到空字符串(如“” + c)时,为什么返回一个未知值?

来自分类Dev

为什么此运行代码不打印字符串的最后一个值 /?

来自分类Dev

使用printf(“%s”,..)打印结构,该结构的第一个变量类型是'char *',为什么可以获取存储在'char *'中的正确字符串?

来自分类Dev

实现一个C函数,该函数在给定字符上拆分字符串,并在拆分后返回字符串数组(以及数组长度)

来自分类Dev

为什么LayoutObjectNames在FileMaker 14中返回一个空字符串?

来自分类Dev

为什么getenv()返回一个非常量字符串

来自分类Dev

为什么R.Version()返回一个“语言”字符串?

来自分类Dev

为什么MATLAB的regexp只返回第一个匹配标记字符串?

来自分类Dev

为什么SUM(`column`)返回一个字符串而不是整数?

来自分类Dev

为什么 Promise 返回一个空字符串?

来自分类Dev

为什么 React Native 返回一个等价于布尔值的字符串?

来自分类Dev

从函数返回一个无空格的字符串

来自分类Dev

Groovy:为什么按空格split()对一个空字符串进行返回会返回一个空字符串的列表?

来自分类Dev

为什么`TRegEx.split` 返回一个空字符串作为第一个元素?

来自分类Dev

为什么在自身上拆分字符串会返回一个长度为2的空切片?

来自分类Dev

当给定一个不带glob字符的字符串时,为什么Perl的glob()函数总是返回文件名?

来自分类Dev

Groovy:为什么按空格分割()空字符串会返回一个空字符串的列表?

来自分类Dev

为什么只给字符分配一个字符指针,而给它分配一个字符串呢?

Related 相关文章

  1. 1

    如果可以给函数一个char *或文字字符串,那么声明此函数的正确方法是什么?

  2. 2

    一个char指针函数在函数内部返回字符串,但在main函数中返回字符串?

  3. 3

    为什么此javascript字符串匹配调用仅返回一个结果?

  4. 4

    为什么我的函数返回一个空字符串?

  5. 5

    为什么打印指向char的指针的第一个元素会打印字符串的内容?

  6. 6

    为什么取消引用指向字符串(char数组)的指针会返回整个字符串,而不是第一个字符?

  7. 7

    为什么此函数返回''而不是串联字符串

  8. 8

    为什么此函数返回''而不是串联字符串

  9. 9

    一个带有字符串参数并返回整数指针的函数

  10. 10

    为什么这个C ++字符串长度计算功能比另一个更快?

  11. 11

    为什么在for循环中第二次运行函数会返回一个空字符串?

  12. 12

    当我将一个char添加到空字符串(如“” + c)时,为什么返回一个未知值?

  13. 13

    为什么此运行代码不打印字符串的最后一个值 /?

  14. 14

    使用printf(“%s”,..)打印结构,该结构的第一个变量类型是'char *',为什么可以获取存储在'char *'中的正确字符串?

  15. 15

    实现一个C函数,该函数在给定字符上拆分字符串,并在拆分后返回字符串数组(以及数组长度)

  16. 16

    为什么LayoutObjectNames在FileMaker 14中返回一个空字符串?

  17. 17

    为什么getenv()返回一个非常量字符串

  18. 18

    为什么R.Version()返回一个“语言”字符串?

  19. 19

    为什么MATLAB的regexp只返回第一个匹配标记字符串?

  20. 20

    为什么SUM(`column`)返回一个字符串而不是整数?

  21. 21

    为什么 Promise 返回一个空字符串?

  22. 22

    为什么 React Native 返回一个等价于布尔值的字符串?

  23. 23

    从函数返回一个无空格的字符串

  24. 24

    Groovy:为什么按空格split()对一个空字符串进行返回会返回一个空字符串的列表?

  25. 25

    为什么`TRegEx.split` 返回一个空字符串作为第一个元素?

  26. 26

    为什么在自身上拆分字符串会返回一个长度为2的空切片?

  27. 27

    当给定一个不带glob字符的字符串时,为什么Perl的glob()函数总是返回文件名?

  28. 28

    Groovy:为什么按空格分割()空字符串会返回一个空字符串的列表?

  29. 29

    为什么只给字符分配一个字符指针,而给它分配一个字符串呢?

热门标签

归档