【问题标题】:C++ Literal String ConcatenationC++ 文字字符串连接
【发布时间】:2011-08-08 00:53:03
【问题描述】:

我有一个关于 C++ 中字符串连接的问题。

string str = "ab" + 'c';
cout << str << endl;

char ch = 'c';
string str1 = "ab";
string str2 = str1 + ch;
cout << str2 << endl;

代码产生:

ed before SaveGraphicsState
abc

谁能解释一下这行的处理:string str = "ab" + 'c';

【问题讨论】:

    标签: c++ string concatenation


    【解决方案1】:
    string str = "ab" + 'c';
    

    字符串文字不能像那样连接。 "ab" 是一个字符数组,它衰减为指针(在此上下文中),并且您正在添加 'c',它是指针的组成部分。所以指针前进了'c'的ascii值。

    也就是说,上面的代码等价于这个:

    char char * s= "ab";
    string str = &s['c']; //the ascii value of 'c' acts like an index to the array. 
    

    我确定这不是您想要的。事实上,它调用了未定义的行为,因为&amp;s['c'] 引用的内存区域可能不在进程的地址空间中。


    您实际想要做的事情的简短形式(即串联)是这样的:

    string str = string("ab") + "c";
    

    【讨论】:

    • 或:string str2 = str1; str2 += ch;
    • -1 "ab"+'c' 等同于 "ab"['c']。前者是指针,后者是字符。
    • @Rob:谢谢。已更正。
    【解决方案2】:

    您对第一行的想法是正确的,这正是正在发生的事情。

    对于像"ab" 这样的文字字符串,没有任何默认的+ 运算符,所以编译器会采用它(作为C 风格的字符串)并使用指向文字的const char* 指针。然后它将您的文字字符 'c' 提升为具有一定价值的 int。然后将此 int 添加到文字的地址并用作 C 字符串。由于您已超出为文字字符串分配的空间,因此结果未定义,它只是从结果地址中打印出字符,直到找到空值。

    如果您想一次性创建字符串,您可以帮助编译器确定您想先转换为 string 并使用强制转换:std::string str = std::string("ab") + 'c';。或者(如在单独的评论中所见)使用可能会或可能不会表现更好的串联来执行此操作。使用你的情况看起来更清楚的那个:std::string str = "ab"; str += 'c';

    在第二种情况下,您已经创建了一个string,而string 有一个重载的operator+,可以进行直观的连接。

    【讨论】:

    • 马克的回答是正确的。但是请注意,您可以编写“ab”“c”而无需任何干预 +,预处理器将为您连接它们。
    【解决方案3】:

    您的猜测是正确的,除了字符串文字不在堆栈上,它在内存中特定于工具链的位置,通常在只读部分中。

    【讨论】:

      【解决方案4】:

      "ab"const char *'c'char。我的猜测是'c'被转换为整数,将所述整数加到"ab"的地址上,将得到的指针传递给std::string的构造函数。你很幸运,它没有严重崩溃。

      请参阅其他答案以了解如何正确进行连接。

      【讨论】:

        【解决方案5】:

        运算符重载仅适用于至少一个重载运算符的参数是用户定义类型(即类实例)的情况,因此无法重载 + 运算符以添加字符串和字符。并做一些明智的事情。充其量,您将执行指针算术 - 几乎可以肯定不是您想要的。通常的解决方法是显式转换:

        string s = string( "foo" ) + "bar";    // s will contain "foobar"
        

        【讨论】:

          【解决方案6】:

          我认为string str = "ab" + 'c'; 的作用类似于:

          string tmp = stirng("ab"); // implicit conversion
          tmp = tmp + 'c'; // uses overloaded + operator
          str = tmp;
          

          【讨论】:

            【解决方案7】:
            "ab"
            

            是一个 C 字符串。

            'c'
            

            是一个字符。

            试试:

            string str = string("ab") + "c";
            

            如果你想让它更简单,总有:

            string str = "ab";
            str += 'c';
            

            或者,您可以使用std::stringstream

            stringstream ss;
            ss << "ab" << 'c';
            

            【讨论】:

              【解决方案8】:

              这是内置在 C++ 中的:

              #include <iostream>
              #include <string>
              
              int main()
              {
                  std::string s("Stand back! I've got jimmies!" "DDD");
                  std::cout << "Stand back! I've got jimmies!" "DDD";
              }
              

              输出:

              Stand back! I've got jimmies!DDD
              

              【讨论】:

                猜你喜欢
                • 2016-03-02
                • 2013-08-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多