2017-10-22 155 views
0
void my_strcat(char *dest, char *src) 
{ 
    (*dest)? my_strcat(++dest, src): (*dest++ = *src++)? my_strcat(dest, src): 0 ; 
} 

/* driver function to test above function */ 
int main() 
{ 
    char dest[100] = "geeksfor"; 
    char *src = "geeks"; 
    my_strcat(dest, src); 
    printf(" %s ", dest); 
    getchar(); 
} 

[與函數體代碼混淆]我瞭解ç主題指針和三元運算非常好,但混亂與上面的代碼這是什麼想在條件語句來檢查和進一步什麼是真假依賴陳述發生。這段C代碼是做什麼的?

任何人都可以詳細解釋它代碼實際上在做什麼?

+0

此函數依賴於在調用之前將dest完全歸零 –

+0

現在,geeksforgeeks已經教會了如何編寫錯誤的C代碼,找到了教導相反的教程。 – Lundin

回答

1

它假定目標緩衝區char dest[100]不僅以null結尾,而且全部填充爲\0

因此,首先,*dest是檢查是否該字符,其中dest點,是一個空終止子,即0

如果它沒有找到它,那麼它遞歸地調用它自己,但是向右一個位置,最終找到null終止符。 (如果沒有空終止符,那麼這個功能是很危險的,寫了緩衝區。)

如果確實找到空終止符,然後將其複製一個從源字符到目的地,然後調用本身與兩個指針向右移動,繼續複製。 (同樣,這似乎是沒有界限的適當檢查工作要做。)

1

三元運算符?僅僅是一個的if-else,所以身體就相當於:

if(*dest) 
    my_strcat(++dest, src); 
else 
    if(*dest++ = *src++) 
     my_strcat(dest, src); 
    else 
     0; 

所以它會遞歸函數,而假設dest是一個以NULL結尾的字符串,並且\0直到它結束,但這就是爲什麼它會測試*dest。此外,我想你現在知道這個功能。

0

函數將src給出的字符串複製到dest數組中給出的\0填充位置上。所以,假如你有

char dest[100] = "geeks for\0 foo \0\0\0 bar "; 
char *src = "geeks"; 

結果將是

geeks forg foo eek bar s 
     ^ ^^^ ^<-- geeks (src) 
^^^^^^^^^ ^^^^^ ^^^^^ <-- geeks for\0 foo \0 bar \0\0\0... (dest) 
1

這一行:

(*dest)? my_strcat(++dest, src): (*dest++ = *src++)? my_strcat(dest, src): 0 ; 

非常遞歸。

通過'dest'步驟直到找到'\ 0'字符,然後將字符從'src'複製到'dest',並且如果複製的字符不是'\ 0',則再次調用自身(和一次又一次),直到複製包括最終'\ 0'的所有字符。

但是,我會擔心最後的零,因爲這不是一個可執行語句。建議使用return代替

+0

無需擔心最終的'0'。表達式是合法的陳述。 –