【问题标题】:Need guidance with aspects of strcpy in C需要 C 中 strcpy 方面的指导
【发布时间】:2020-09-11 15:03:02
【问题描述】:

此代码来自 string.c 中的 strcpy 我想了解这里的一些功能:

 char *(strcpy)(char *restrict s1, const char *restrict s2)
 {
     char *dst = s1;
     const char *src = s2;
     while ((*dst++ = *src++) != '\0')
         ;
     return s1;
 }

这个while循环发生了什么?

(*dst++ = *src++)

谢谢。

【问题讨论】:

  • 详细说明“为什么他们将 src 声明为 const char 而不仅仅是 char”--> src 不是 const charsrcconst char *src 是一个指针。
  • (1) (*dst++ = *src++) 将一个字符从源复制到目标并将两个指针都前进,因此下次它将复制下一个字符。由于赋值的结果是赋值的值,循环将在复制一个 NUL 后停止,该 NUL 必须位于每个字符串的末尾。 (2a) 这样如果它也是一个类似函数的宏,它就不会被扩展。 (2b) 返回类型是char *,因为它返回一个指向字符数组的指针,也就是一个字符串。 (3) 通知世界它不会修改src。 // 尝试在每个帖子中问一个问题,并尝试更好地解释您的困惑。
  • 但 char *dst 也是如此。那么为什么要使用 const 呢?
  • 因为它确实修改了dst
  • so rici,如果我想从一个数组复制到另一个数组,我可以在函数之外说 `while ((a++ = b++) != '\0') 没有指针引用像这样一个空的身体,这是可以接受的语法吗?并且可能比执行相同操作的 for 循环更有效?

标签: c string strcpy


【解决方案1】:

(*dst++ = *src++)

这里发生了很多事情。 首先要注意的是,这是将*src++ 的值分配给*dst++。 星号取消引用dst++src++,因此这是一个char 对另一个的分配。请注意,++ 运算符的优先级高于 *(取消引用)运算符。见https://en.cppreference.com/w/c/language/operator_precedence

第二个重要的细节是增量是后缀; ++ 位于变量 dstsrc 的右侧。所以dstsrc 只有在while 内的检查完成后才会增加。实际上,这会将dst 中的第一个字符设置为src 中的第一个字符。

所以,src 的第一个字符不是零字符 \0 时,dstsrc 就会加一。

关于您的第二个问题,请参阅What do the parentheses around a function name mean?

src 被声明为const char *,因为它指向的字符没有被修改,这通常是一种很好的做法。网上有很多关于这个的讨论;例如https://dev.to/fenbf/please-declare-your-variables-as-const。请注意,src 本身(指针)在 while 循环中被明显修改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2019-05-15
    • 2023-01-15
    • 2017-03-30
    相关资源
    最近更新 更多