2017-10-06 45 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,也是工作,如果给定全长。