2016-07-01 172 views
0

新手在c编程。有人能帮我理解while循环在这段代码中做什么吗?我从来没有见过这种类型的while循环。奇怪的循环。困惑

但是,我确实知道它正在执行指针算术,但是它究竟是按照伪代码还是简单的英文来分解呢? :)

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

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

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

我相信这是复制从一个源到另一个字符串。它的性格是如此。它在一条线上做了很多工作。它将* d设置为* s处的任何内容,并将它们递增到下一个字符。当它最终到达空字符(字符串的末尾)时,它返回它,导致while循环结束。 – ritlew

+1

您是否在K&R书中阅读过此内容?你最好调用'memcpy'来复制一个字符串 –

+1

寻求调试帮助的问题(“为什么不是这个代码工作?”)必须包含所需的行为,特定的问题或错误以及重现它所需的最短代码这个问题本身。没有明确问题陈述的问题对其他读者无益。请参阅:如何创建最小,完整和可验证示例。 – Olaf

回答

2

在C中,值0意味着虚假和其他任何手段都是正确的。字符串结尾的值为0的空字符。此while循环将所有字符从s复制到d,直到到达null(字符串结尾)。

*s++被分配到*d

两个sd将空字符后指向循环后*d++ = *s++返回相同的值分配。请注意,null也被复制。

+0

所以这也是一个赋值操作? –

+0

是的,该函数正在堆上的输入字符串的副本,并返回一个指向该新字符串的指针。来电者必须记得释放它否则会泄漏。 – T33C

1

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

1

伪代码:

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 
+0

正确,除非指针's'和'd'被移动到下一个字符,即使该字符被复制*为''\ 0''(尽管循环结束后)...除非编译器决定跳过我想是最后一个增量。 – Dmitri

+0

@Dmitri你是对的。 Good catch –

+0

@Dmitri P.S.如果我们正在谈论编译器将对代码做什么,那么这个答案会非常不同;) –