C语言中strlen函数代码的理解

xa9qqrwz  于 2022-12-17  发布在  其他
关注(0)|答案(2)|浏览(102)

我得到了一个解决方案,在C编程中重新创建函数strlen的问题,它是如下所示的,我需要帮助来理解代码实际上在做什么。

void    *ft_memset(void *b, int c, size_t len)
{
    size_t i;

    i = 0;
    while (i < len)
    {
        ((unsigned char *)b)[i] = c;
        i++;
    }
    return (b);
}

我最大的疑问是((unsigned char *)b)[i] = c的含义,特别是因为我不理解( *)b,以及在void函数中需要返回b
非常感谢您的帮助,对不起,如果我做错了什么,这是我的第一篇文章堆栈溢出。

nzk0hqpo

nzk0hqpo1#

让我们把它分解一下,尽管我的C语言技能有些生疏了。欢迎编辑:)

void    *ft_memset(void *b, int c, size_t len)
{
    size_t i;

    i = 0;
    while (i < len)
    {
        ((unsigned char *)b)[i] = c;
        i++;
    }
    return (b);
}

首先,声明了一个名为ft_memset的函数,该函数返回void *
void *意味着指向任何对象的指针。它只是一个数字,指向一个内存地址。但是我们不知道里面有什么,因为它没有被正确地注解。
您的函数接受三个参数:b,它是指向 anything 的指针(如果愿意,也可以是void指针)c,它是int 32位有符号整数。len,它是size_t,通常是无符号整数的别名。Read more about size_t over here
您的函数迭代len的前几个字节,并将c的值设置为这些字节。
我们基本上覆盖了b的第一个len字节内容。
现在,((unsigned char*)b)是什么意思,这个语句是把你的void *转换成一个unsigned char*(字节指针),这只是告诉编译器我们要处理b所指向的内容,就好像它们只是一个unsigned char一样。
稍后我们只对第i个位置进行索引,并在其中设置值c

ijnw1ujt

ijnw1ujt2#

理解函数strlen的代码
void *ft_memset(void *b, int c, size_t len)类似于void *memset(void *s, int c, size_t n),它们都为b指向的内存赋值,这些函数与strlen()有很大不同。
size_t strlen(const char *s)不会改变s指向的内存。它会遍历该内存以查找 * 空字符 *。

size_t strlen(const char *s) {
  const char *end = s;
  while (*end != '\0') {
    end++;
  }
  return (size_t)(end - s); 
}

// or

size_t strlen(const char *s) {
  size_t i = 0;
  while (s[i] != '\0') {
    i++;
  }
  return i; 
}

相关问题