【问题标题】:google tests: can not create string from char array?谷歌测试:不能从 char 数组创建字符串?
【发布时间】:2018-03-18 18:15:55
【问题描述】:

我运行这个测试:

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

【问题讨论】:

    标签: c++ string char googletest


    【解决方案1】:

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

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

    char tmp[4] = {};
    

    【讨论】:

    • char tmp[4] = "";
    • 该死,我只是读得太快了:stackoverflow.com/questions/8960087/…:“字符串类有一个构造函数,它接受一个以 NULL 结尾的 C 字符串”,我跳过了“以 NULL 结尾的部分” .
    • 你也可以使用std::string combination(std::begin(tmp), std::end(tmp));
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      char tmp[3]; 不是以 null 结尾的使用 char tmp[4] = {0};

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-20
        • 2016-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-05
        • 1970-01-01
        相关资源
        最近更新 更多