2010-02-01 98 views
2

我在寫一個簡單的字符串連接程序。查找字符串的結尾:* s ++ VS * s then s ++

該程序以我發佈的方式工作。但是,我首先使用下面的代碼來編寫代碼來查找字符串的末尾:

while (*s++) 
    ; 

但是,該方法不起作用。我傳給它的字符串沒有正確複製。具體來說,我試圖將「abc」複製到保存「\ 0」的char []變量中。

從閱讀C K & R書,它看起來應該工作。該緊湊形式應採取以下步驟。

  1. * S與 '\ 0' 相比
  2. s指向下一個地址

那麼,爲什麼不工作?我正在用Debian上的gcc編譯。

我發現,這個版本沒有問題:

strncat(char *s, const char *t, int n) 
{ 
    char *s_start = s; 

    while (*s) 
     s++; 

    for (; n > 0 && *t; n--, s++, t++) 
     *s = *t; 

    *(s++) = '\0'; 

    return s_start; 
} 

在此先感謝。

+3

供將來參考「沒有用」。 *不是*失敗模式的有用描述。結果與預期結果有什麼不同? – dmckee 2010-02-01 04:45:34

+0

不相關的筆記,每當做非明顯的東西,使用括號。你可能還記得現在++在運算符優先級表中位於*之上,但是經過7個小時的編碼之後,你真的開始懷疑是否* s ++;意思是*(s ++);或(* s)++; – 2010-02-01 08:18:53

+0

只是一個附註:爲該功能取另一個名稱。這不是strncat的工作原理。 – quinmars 2010-02-01 12:34:37

回答

14

while (*s++);結束之後,s指向之後的字符爲空終止符。在下面的代碼中考慮這一點。

4

有區別。在第一種情況下,s將指向'\ 0'後面的位置,而第二個位置則停在'\ 0'處。

6

問題是

while (*s++) 
    ; 

始終增量S,即使當s是零(* s爲假)

while (*s) 
    s++; 

只有當* s爲非零

所以值被增加了第一個將留下第一個字符第一個\ 0,而第二個將留下s指向第一個\ 0。

0

另外說了什麼,請注意,在C語言中,指向未分配內存的指針在技術上是非法的,即使您不取消引用它。所以一定要修復你的程序,即使它看起來有效。

+0

指定數組後特定允許指向的第一個位置(以便與數組中的指針進行比較)因此這不是問題 – 2010-02-01 14:31:00

+0

在數組末尾尋址一個項是標準明確定義的特例。這是一個包含關於它的討論的主題:http://stackoverflow.com/questions/988158/take-the-address-of-a-one-past-the-end-array-element-via-subscript-legal- by-the – indiv 2010-02-01 14:36:13

+0

@jk:好點。 – 2010-02-01 14:36:39

2

正如約翰Knoeller說,在運行它會旨意空後指向位置結束。 無需犧牲性能爲正確的解決方案..看看自己:

while (*s++); --s;

應該做的伎倆。

+1

你是不是故意說'while(* s ++); --s;'? – 2010-02-01 13:40:51

+0

哎呀!感謝您的支持......當我在趕時間的時候,我正在出門工作。 – 2010-02-01 14:18:38

相關問題