繁体   English   中英

了解 C 编程中函数 strlen 的代码

[英]Understanding code of function strlen in C Programming

我得到了在 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的需要。

非常感谢您的帮助,如果我在堆栈溢出的第一篇文章中做错了什么,我深表歉意。

让我们分解一下,尽管我的 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是一个指向任何东西的指针(或者如果你愿意的话,也可以是 void 指针) c是一个int 32 位有符号整数。 len是一个size_t ,通常是无符号整数的别名。 在此处阅读有关size_t的更多信息


您的函数遍历前len个字节并将c的值设置为这些字节。

我们基本上覆盖了b的前len个字节的内容。


现在, ((unsigned char*)b)是什么意思。 该语句将您的void *转换为unsigned char* (字节指针),这只是告诉编译器我们将处理b指向的内容,就好像它们只是一个unsigned char一样。

稍后我们只是在第i个位置建立索引并在其中设置值c

理解函数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; 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM