我运行此测试:
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~
我认为这不是打印本身的问题,因为我注意到一些测试比较了char数组生成的字符串没有通过,我最终做到这一点,我无法弄清楚原因。所以感觉确实“组合”字符串最终没有预期的内容。
“常规”可执行文件(不是gtest)中的相同代码打印出预期的内容(没有奇怪的补充字符的3个字符)。
答案 0 :(得分:5)
不幸的是std::string
does not have a constructor引用了char数组。所以你最终调用了const char*
构造函数,而这个构造函数需要指针指向空终止字符串的第一个元素。您的char数组不以空值终止,因此您最终会得到未定义的行为。
你应该空终止tmp
,你可以通过用一个额外的字符声明它并将其设置为'\0'
来完成。你可以像这样实现
char tmp[4] = {};
答案 1 :(得分:1)
std::string combination(tmp);
中的构造函数仅在tmp
为空终止时才有效。否则构造函数找不到字符串的长度。
但是,您可以通过明确提供缓冲区的大小来帮助std::string
:
std::string combination(tmp, sizeof(tmp));
这个构造函数主要用于从C风格的字符串的一部分构造std::string
,但如果给定全长,也可以工作。
答案 2 :(得分:0)
var params = {name: "Stack", surname: "Overflow"};
var service = Restangular.one('users');
service.get(params).then(function(response) {
console.log(response);
})
不是以空值终止的使用char tmp[3];