2017-10-06 57 views
0

我運行這個測試::不能從char數組創建字符串?

TEST_F(CHAR_TESTS, wtf){ 
    char letter[3] = {'A','B','C'}; 
    char types[2] = {'o','s'}; 
    char tmp[3]; 
    for(int i=0;i<3;i++){ 
    for(int j=0;j<3;j++){ 
     for(int k=0;k<2;k++){ 
     tmp[0]=letter[i]; 
     tmp[1]=letter[j]; 
     tmp[2]=types[k]; 
     std::string combination(tmp); 
     std::cout << combination << std::endl; 
     } 
    } 
    } 
} 

出於某種原因,這種打印:

AAo~ 
AAs~ 
ABo~ 
ABs~ 
ACo~ 
ACs~ 
BAo~ 
BAs~ 
BBo~ 
BBs~ 
BCo~ 
BCs~ 
CAo~ 
CAs~ 
CBo~ 
CBs~ 
CCo~ 
CCs~ 

我不認爲它與印刷本身的問題,因爲我最終注意到後這樣做一些測試比較字符數組產生的字符串沒有通過,我不明白爲什麼。所以感覺確實是「組合」字符串不會達到預期的內容。

在「常規」的可執行文件(不是GTEST)打印出的期望是什麼(3個字符不奇怪的補充字符)相同的代碼。

回答

5

不幸std::stringdoes not have a constructor其花費炭的數組的引用。所以,你最終調用const char*構造,而這一次需要指針指向一個空結尾的字符串的第一個元素。你的字符數組是不是空終止,所以你最終未定義行爲

你應該用空字符結束tmp,您可以通過一個額外的字符聲明,然後將其設置爲'\0'做。你可以做到這一點像這樣

char tmp[4] = {}; 
+0

或者'char tmp [4] =「」;' –

+0

該死的,我剛纔讀了這個有點太快了:https://stackoverflow.com/questions/8960087/how-to-convert-a-char-array -to-A-字符串:「字符串類有一個構造函數以NULL結尾的C-字符串」,我跳過了「NULL結尾部分」。 – Vince

+1

你也可以使用'的std :: string組合(標準::開始(TMP)的std ::結束(TMP));' – legalize

0

char tmp[3];是不是空終止使用char tmp[4] = {0};

1

std::string combination(tmp);的構造函數只有tmp是NUL終止工作。否則構造函數找不到字符串的長度。

然而,您可以通過顯式地提供了緩衝區的大小幫助std::string

std::string combination(tmp, sizeof(tmp)); 

此構造primarilly打算從C風格的字符串的一部分構造一個std::string,也是工作,如果給定全長。