将字符推送到字符串向量时出现意外行为

时间:2016-10-04 18:28:15

标签: c++ string vector c++14 stdvector

我试图通过首先将字符转换为字符串来将字符插入字符串向量,但是情况1不起作用但是情况2正在工作。有人可以解释一下这种行为。将char直接插入向量的任何解决方法?

int

PS - 我正在使用C ++ 14

3 个答案:

答案 0 :(得分:1)

此代码编译并运行:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
   // vector of strings

   vector<string> out;

   // a character
   char ch;

   // assign some value to ch and push to vector

   // Case 0: works because a const char * can be coerced into a string
   out.push_back("");

   // Case 1: Does not work 
   // you can't add a const char * and a char.
   // Some compilers coerce the char into an int and add that to the pointer
   // producing undefined behavior (access to un-allocated memory)
   // out.push_back("" + ' ');

   // CASE 1a: Works, but I'm 'cheating' by 
   // explicitly constructing a string.
   out.push_back(string("") + ch);

   // Case 1b: Works using a different string constructor
   // This is probably the best approach:
   out.push_back(string(1, ' '));

   // CASE 2: works
      string str = "";
      out.push_back(str + ch);

   std::cout << "out contains " << out.size() << " entries" << std::endl;

   return 0;
}

结果:

out contains 3 entries

答案 1 :(得分:1)

术语""并不代表std::string实例,而是const char*字面值,因此当您向其添加ch时,您正在执行指针运算,很可能接收编译器警告:

  

警告:数组下标高于数组边界

push_back char作为std::stringstd::vector<std::string>,只需执行以下操作:

std::vector<std::string> vec;
char ch = 'a';
vec.push_back(std::string()+ch); // construct empty std::string, add ch, push_back

答案 2 :(得分:1)

您的代码存在问题。 这是类型特征,它将帮助您检查名称是否为模板化类型:

/***Check if type is simple template***/
template <template<class...> class>
constexpr bool is_template_type()
{ return true; }

template <class>
constexpr bool is_template_type()
{ return false; }

通过这个,您可以检查vector是否是用于创建变量的有效类型。所以:

static_assert(!is_template_type<vector>(), 
              "vector is not valid type for creating a variable");

导致编译失败,因为您无法创建class template的变量。您必须指定TYPE应存储的std::vector。你的问题标题说:

  

字符串向量

所以你应该创建std::vector<std::string>变量。

您的代码的另一个问题是: "" + ch。 你觉得它做什么? ""类型为char const[1]ch类型为charchar const[1]可隐式转换为char const *,因为您可以向指针添加整数值 - 它会编译。但这不是你想要的!

这是您在内存中的""

`\0' ? ? ? ? ? ? ...
/\

当您向ch添加""时,结果如下:

//ch is 5 for example
`\0' ? ? ? ? ? ? ...
             /\

所以你用一些未指定的地址创建std::string。实际上,访问数组越界是C ++中的Undefined Behavior。

您应该使用用户W.F.的std::string() + ch或字符串文字语法。在他对你的问题的评论中发表。

也不要忘记初始化ch,因为使用未指定的值也是未定义的行为。