2016-07-01 219 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.如果我們正在談論編譯器將對代碼做什麼,那麼這個答案會非常不同;) –