【问题标题】:Strange while loop. Puzzled奇怪的while循环。困惑
【发布时间】:2016-07-02 04:37:42
【问题描述】:

c 编程新手。有人可以帮我理解 while 循环在这段代码 sn-p 中的作用吗?我从未见过这种类型的 while 循环。

但是,我确实知道它正在执行指针运算,但它实际上是在说什么以伪代码或简单的英语分解? :)

char*
cpy (char* s)
{
  char *dest, *d;

  d = dest = malloc(strlen(s) * sizeof(char) + 1);

  if (d)
    while ((*d++ = *s++));
  return dest;
}

【问题讨论】:

  • 我相信它是将字符串从一个来源复制到另一个来源。它是按角色做的。它在一行中做了很多事情。它将 *d 设置为 *s 处的任何值,并将它们都递增到下一个字符。当它最终到达空字符(字符串的结尾)时,它会返回它,从而导致 while 循环结束。
  • 你在 k&r 的书中读过这个吗?你最好调用memcpy 来复制一个字符串
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
  • @self 这可能不是 OP 的实现,它可能只是他们看到并希望帮助理解的一个例子。我同意只使用memcpy 会更容易,但我认为这更多的是试图掌握某些语法。 编辑: strcpy 也是一个东西
  • @ChrisSprague 没错。这不是我的代码。我只是想掌握语法,这对我来说很陌生。

标签: c


【解决方案1】:

在 C 中,值 0 表示假,任何其他值表示真。字符串以值为 0 的空字符结尾。此 while 循环将所有字符从 s 复制到 d,直到到达空字符(字符串结尾)。

赋值*d++ = *s++返回的值与*s++赋值给*d的值相同

在循环之后s 和d 都将指向空字符之后。请注意,null 也会被复制。

【讨论】:

  • 所以这也是赋值操作?
  • 是的,该函数正在堆上复制输入字符串并返回指向该新字符串的指针。调用者必须记住释放它,否则它会泄漏。
【解决方案2】:

表达式*d++ = *s++ 实际上返回一个值。它会一直运行,直到找到一个字节:\0,当放入 while 条件时,它将为零并跳转到下一条语句:return 语句。

【讨论】:

    【解决方案3】:

    伪代码:

    if dest is not null initially:
        keep a pointer to the current character in "s" and "d".
        (copy step) copy the current character in "s" to the same position in "d"
        move the pointer to the next character in "d" and "s"
        if the character copied in "copy step" was not '\0' or null:
            jump back to "copy step"
        otherwise:
            break out of loop
    

    【讨论】:

    • 正确,除了指针s 和d 被移动到下一个字符,即使复制的字符是 '\0'(尽管循环确实在之后结束)。 ..除非编译器决定跳过最后一个增量,我想。
    • @Dmitri P.S.如果我们谈论的是编译器将对代码做什么,那么这个答案将大不相同;)
    猜你喜欢
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多