2013-01-23 50 views
2

我今天有一個inverview,並被要求編寫兩個字符串連接的函數。但是在完成之後,我聽說,通常代碼是可以的,但是我在那裏做了一些小錯誤。在家裏檢查過,但一切正常。有什麼問題?在C字符串中找到錯誤

char * strconcat (char *S1, char *S2){ 
    char *S3 = new char [strlen(S1) + strlen(S2) +1]; 
    strcpy(S3, S1); 
    strcat(S3, S2); 
    return S3; 
} 
+0

像那樣使用'new'既不是慣用的C也不是C++。 – Pubby

+3

這是C和C++的奇怪混合體。你給了什麼具體的指導方針?如果我被問到這個問題,作爲一個C++問題,我會回答:'std :: string concat(const std :: string&s1,const std :: string&s2){return s1 + s2; ''你的代碼很快,很髒,而且「大部分時間可能都足夠了」。這不是我想要有人試圖告訴我他知道如何編寫代碼的方式。 –

+0

也許是因爲你沒有檢查空指針? – Pubby

回答

1
char * strconcat (char *S1, char *S2){ 
    if(S1 == NULL || S2 == NULL) 
     return NULL; 
    int S1_len = strlen(S1); 
    int S2_len = strlen(S2); 
    char *S3 = new char [S1_len + S2_len +1]; 
    memset(S3, 0, S1_len + S2_len +1); 
    strcpy(S3, S1); 
    strcat(S3, S2); // or memcpy(S3+S1_len, S2, S2_len); 
    return S3; 
} 
+0

爲什麼你在用new – user1448906

5

嗯......我想這是關於要求和質量的期望。

有幾件事情:

  • 輸入指針應const
  • 你不處理new[]失敗(它會拋出一個異常,雖然這可能是好的)。
  • 對於性能,最好不要執行strcpy()/strcat()序列,因爲您花費的時間比必要的行走字符串多。
  • 風格上,它有點「關閉」。它看起來很像C代碼,但使用C++構造。
2

除了編寫C代碼(減去new),您的代碼不工作無處不在它的預期,例如:

char* hellowWorld = strconcat("Hello ", "world!"); 

如果你不能直接說爲什麼這是不行的,嘗試編譯 - 錯誤會給你一個提示。

+0

您能否告訴我們爲什麼它不起作用?謝謝。 – mfc

+0

@mfc你編譯過嗎? –

+0

是的,它似乎工作,但當然,使用後需要刪除返回的指針。 – mfc

0

看起來像你在編碼中混合了C,C++風格。你嘗試使用新的方式也不是標準的方式。你可以使它成爲純粹的C或C++方式。

看起來,他們將風格視爲錯誤,雖然它在工作。但是你無法預測面試官的心態。