2012-11-12 66 views
0
#include <stdio.h>  

int main() 
{ 
    char s[] = "churchgate: no church no gate"; 
    char t[25]; 
    char *ss, *tt; 
    ss = s; 
    while (*ss != '\0') 
    *tt++ = *ss++; 
    printf("%s\n", t); 
    return 0; 
} 

這段代碼有什麼問題?當我嘗試運行它時,它顯示了一些垃圾值。顯示錯誤的字符串代碼?

+2

後檢查t

  • 沒有0終止通過未初始化的指針寫入是未定義的行爲。 –

  • +0

    添加'static_assert(sizeof(s)<= 25,「壞壞壞」);' – Lundin

    +1

    @Lundin,我會建議'char t [sizeof(s)];'而不是。特別是,考慮到它是'c'標記的。 –

    回答

    3

    您從未將tt指向任何東西。你需要把它指向t

    tt=t; 
    
    +0

    哦謝謝了。這些指針讓我困惑。 –

    3
    1. 你忘了inialize ttt
    2. 你的陣列太小。
    3. 你忘了null終止你的數組。
    +0

    誰在乎2,給1? :) –

    +0

    @ MichaelKrelin-hacker是的,我試圖做到盡善盡美;) – ouah

    +0

    是的,你已經做得相當徹底,因此我的upvote。 –

    0

    幾個問題:

    1) 「TT」 從未初始化,

    2) 「S []」 可能是只讀(取決於編譯器/平臺)! !

    建議:

    #include <stdio.h> 
    
    #define MAX_STRING 80 
    
    int 
    main() 
    { 
        char s[MAX_STRING] = "churchgate: no church no gate"; 
        char t[MAX_STRING]; 
        char *ss = s, *tt = t; 
        while (*ss) 
        *tt++ = *ss++; 
        *tt = '\0'; 
        printf("%s\n", t); 
        return 0; 
    } 
    
    +0

    2只有在指針初始化的情況下? –

    +2

    's'只讀? 's'不是一個字符串文字。 – ouah

    1

    芹苴它可以很有趣,在內存的任意位置進行試驗,如果你想有一個定義的行爲接入的目標,必須定義。

    在對其執行操作之前,tt必須指向內存空間中的某個定義區域。

    *tt++ = *ss++; 
    

    s是30字節。 t,如果那是你想用於tt的那個是25.

    +0

    嗯。我數了30? –

    +0

    @ MichaelKrelin-hacker;你是非常正確的,我在那裏計算字符有點困難。謝謝:) –

    +0

    這是因爲我沒有將它粘貼到控制檯'echo -n .... | wc -c'(並添加了一個用於終止符);-) –

    0

    幾種可能性,例如,摹:

    #include <stdio.h>  
    
    int main() 
    { 
        char s[] = "churchgate: no church no gate"; 
        char t[25]; 
        char *ss, *tt; 
        for (ss=s, tt=t; *ss != '\0' && tt-t < sizeof(t)-1; ss++, tt++) 
        *tt = *ss; 
        } 
        *tt = '\0'; 
    
        // or just use strncpy. 
        // strncpy doesn't copy the \0 if the size is reached, 
        // so account for that. 
        strncpy(t, s, sizeof(t)-1); 
        t[sizeof(t)-1] = '\0'; 
    
        printf("%s\n", t); 
        return 0; 
    } 
    

    你知道從其他答案你的主要問題:

    1. tt初始化
    2. 沒有界限複製