2013-04-24 183 views
0

我有這樣的代碼:不同的答案

//function to delete the occurence of c in s 
void squeeze(char s[], int c) { 
    int i,j; 
    for(i=j=0;s[i]!='\0';i++) 
    if(s[i]!=c) 
     s[j++]=s[i]; 
    s[j]='\0'; 
} 

//function to concatenate string 
void strca(char c[],char b[]){ 
    int i,j; 
    i=j=0; 
    while(c[i]!='\0') 
    i++; 
    c[i++]=' '; 
    while((c[i++]=b[j++])!='\0') 
    ; 
} 

現在,當我調用的函數在main()

int main(void){ 
1 char test[]="carmakarchile"; 
2 //squeeze(test,'a'); 
3 //printf("%s\n",test); 
4 char f[]="Magnificent"; 
5 char n[]="King Rex"; 
6 strca(f,n); 
7 squeeze(test,'a'); 
8 printf("%s\n",test); 
9 printf("%s",f); 
    } 

給出了OP:

King Rex 
    Magnificent King Rex 

雖然刪除評論在2和3號線,並把評論7和8號線給我:

 crmkrchile 
     Magnificent King Rex 

我只是想知道爲什麼和怎樣的差別產生的?在此先感謝

回答

2
char f[]="Magnificent"; 

使得陣列f只是大到足以容納字符串"Magnificent",包括0終止。

char n[]="King Rex"; 
strca(f,n); 

高興地寫入數組邊界之外,調用未定義的行爲,顯然在這種情況下,覆蓋你的其他陣列test

如果聲明數組大到足以容納串聯的結果,

char f[32] = "Magnificent"; 

例如,一切都將正常工作。

+0

哦..我知道了..謝謝很多:) – ejjyrex 2013-04-24 18:42:02

0

你的連接函數寫過c []數組。如果要連接字符串,則需要確保爲兩個字符串分配足夠的內存(包括終止\0)。

現在在你的例子中,你只是幸運地認爲f []和n []恰好在內存中彼此相鄰,所以當你用空格替換終止null時,它似乎是一個串聯的字符串。

相關問題