谷歌测试:无法从字符数组创建字符串

google tests: can not create string from char array?

本文关键字:字符 数组 创建 字符串 测试 谷歌      更新时间:2023-10-16

我运行这个测试:

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 个字符)。

不幸的是,std::string没有引用字符数组的构造函数。因此,您最终会调用 const char* 构造函数,而这个构造函数需要指针指向以 null 结尾的字符串的第一个元素。您的 char 数组不以 null 结尾,因此您最终会得到未定义的行为

您应该 null 终止 tmp ,您可以通过用一个额外的字符声明它并将其设置为 '' 来实现。你可以像这样实现

char tmp[4] = {};

std::string combination(tmp);中的构造函数仅在 tmp 以 NUL 终止时才有效。否则,构造函数找不到字符串的长度。

但是,您可以通过显式提供缓冲区的大小来帮助std::string

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

此构造函数主要用于从 C 样式字符串的一部分构造std::string,但如果给定完整长度,也可以工作。

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