2016-12-13 33 views
0

我做了這個程序來模擬strcat的功能,但與它的printf我不明白的錯誤...在我的strcat代碼中printf有什麼問題?

下面是代碼:

#include <stdio.h> 

char *mystrcat(char *s1, char *s2); 

int main(void) 
{ 
    char *s1,*s2; 
    s1="asdad"; 
    s2="asdad"; 
    s1=mystrcat(s1,s2); 
    printf(s1); 

    return 0; 
} 
char *mystrcat(char *s1,char *s2) 
{ 
    int i,j; 
    for(i=0;s1[i]<'\0';i++) ; 
    for(j=0;s2[j]!='\0';j++) s1[i+j]=s2[j]; 
    s1[i+j]='\0'; 
    return s1; 
} 
+3

2)'s1'中沒有空格來容納連接的字符串。 – BLUEPIXY

+1

作爲附加說明,您可能不應該使用'printf(s1)'而是'puts(s1)'或'printf(「%s \ n」,s1)''。特別是如果字符串不是編譯時常量,如果它們碰巧包含格式說明符,那麼將它們用作'printf'的格式字符串是一個嚴重的問題。 – Arkku

回答

4

第一個問題是s1沒有足夠的空間將s2添加到它。您需要s1指向的緩衝區的大小至少爲strlen(s1) + strlen(s2) + 1+ 1是NUL終結符)。

第二個問題是字符串文字是隻讀的。您從"asdad"分配s1,它創建一個指向(可能)只讀內存的指針。當然,第一個問題意味着即使它是可寫的,你也沒有足夠的空間追加到最後,但這是C中常見的缺陷之一,值得一提。

第三個問題(在another answer已經提到)是比較s1[i] < '\0'是錯的,你不會找到正確的s1的長度,因爲環路將無法運行甚至一個迭代。正確的條件與您的第二個循環!= '\0'相同。 (這會掩蓋問題1,因爲那時您無意中從頭開始覆蓋s1。)

+0

小心「s1'的大小」。由於's1'是一個'char *',它的大小與它指向的對象無關。 – EOF

+0

@EOF正確,已更正。 – Arkku

+0

非常感謝!你可以更具體一些,我該如何解決第二個問題? – Metalingus

4

至少,s1[i] < '\0'是一樣的作爲s1[i] < 0,這總是假的。

+1

'char'可以是'signed',這可以使's1 [i] <0'爲真,對吧? –

+1

FiddlingBits提供了一個很好的觀點:關係表達式不正確,但不是您指定的原因。例如,'(int)(char)( - 1)'在我的平臺上產生-1,而不是像'(int)(unsigned char)( - 1)'那樣產生255。同樣,另一個平臺可能在前一種情況下產生255(或另一個值;並非每個實現都使用二進制補碼),而'(int)(signed char)( - 1)'的結果爲-1。一些編譯器甚至支持通過編譯器標誌來使'char'有符號或無符號。 char的簽名由ISO C標準定義,所以's1 [i] <0'並不總是假的。 –