字符串连接不能按预期工作

时间:2014-02-15 17:25:35

标签: c++

(win7; gcc 4.8.2(cygwin))

下面的代码片段会产生count error Pointer\\而不是( "Pointer" )。我能做些什么来获得正确的结果吗?

  virtual string toString() const { 
     return "Pointer";
  }
  virtual string write() const {
     string str = "( " + '"' + toString() + '"' + " )";
     return str;
  }; 

2 个答案:

答案 0 :(得分:4)

首先,让我们澄清一些事情:

+-------------+----------------+-----------------------+
| Expression  | Type           | Type as operator arg  |
+-------------+----------------+-----------------------+
|  toString() |  std::string   |  std::string          |
|  "( "       |  char const[3] |  char const*          |
|  '"'        |  char          |  char                 |
+-------------+----------------+-----------------------+

这些并非都是“字符串”。

这里的主要问题是"( " + '"'没有按照您的想法行事。将char“添加”到const char*不会构建更大的字符串;它为字符串文字的指针值添加一个数字。在这样做的过程中,你创建了一个新指针,指向......好吧......无处可用。事实上,到目前为止,你通过递增指针来调用未定义的行为

有点像这样:

char const* whatYouAreDoing()
{
   char const* a = "( ";
   char b = '"';

   int c = b;
   assert(c == 34);  // assuming ASCII 
   a += c;           // whoops!

   return a;         // this pointer is now nonsense
}

通常,如果要“构建”字符串,可以使用流格式:

virtual string write() const
{
   std::stringstream ss;
   ss << "( " << '"' << toString() << '"' << " )";
   return ss.str();
}

或者,在这种情况下,由于您实际上并不需要所有这些文字,因此以下情况可以正常:

virtual string write() const
{
   return "( \"" + toString() + "\" )";
}

答案 1 :(得分:0)

您应该使用字符串作为第一个加数,为了安全起见,您还需要一些大括号。确保所有的加数都是字符串(可能在转换后)。

好吧,这并不完全正确,如果存在这样的事情,像+ (std::string&, consts char*)这样的运营商也可以。但是,我希望你明白这个想法。您必须确保使用预期的+ - 操作,即来自string - 类的操作。

请参阅以下示例:

#include <string>
#include <iostream>

using namespace std;

string toString() { 
    return "Pointer";
}
string write() {
    string str = string("( ") + '"' + (toString() + '"') + " )";
    return str;
};

int main()
{
    std::cout << "Test:>>" << write() << "<<\n";
  return 0;
}