关于返回字符串长度的困惑

标签 c string pointers

我重写了 strlen()来自 <string.h> 的函数 header 。

使用下面的代码调用该函数会产生一个高得离谱的数字,例如6356735

#include <stdio.h>
#include <string.h>

size_t my_strlen(const char *s);

int main(void) {
    const char str[] = "abcd";

    printf("length of abcd: %d\n", my_strlen(str));
}

size_t my_strlen(const char *s) {
    const char *p = s;
    while (*s)
        s++;
    return s;
}

更改 my_strlen 的返回语句至 return s - p;给出正确的字符串长度。

如果我没记错的话,p指向字符串的开头,所以减去 p来自 s应与 s 相同?这具体是如何工作的?

最佳答案

在这里,您返回的是字符串(指向 char 的指针)而不是字符串的长度:

size_t my_strlen(const char *s)
{
    const char *p = s;
    while(*s)
        s++;
    return s; // here
}

相反,这样做(从开头减去字符串的末尾):

size_t my_strlen(const char *s)
{
    const char *p = s;
    while(*s)
        s++;
    return s-p; // here
}

字符串不存储在零位置,它们存储在内存中的某个位置(某个位置不为零,取决于环境)。

例如,取这个:char *p1 = "helloworld"; char *p2 = "再见"; p1 = p2 + 5;p1 没有指向 world ,它指向 ye

关于关于返回字符串长度的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57446441/

相关文章:

c - 删除二叉树元素

java - 如何在java中的括号和单引号之间添加空格?

c - 行列式程序无法正常工作

c - 使用分治法获得数组的第二大元素

c - 使用 GCC + ARM 减少递归期间的堆栈使用

在C中将二进制字符串转换为int

Python ctypes : How to modify an existing char* array

c++ - 可以取消引用这个指针吗?

c - 使用循环在 C 中打印模式

Java 数据结构与 Redis