连接字符串时出现意外问题

时间:2014-01-14 04:00:29

标签: c++ string c++11

我正在尝试使用+连接字符串,但是有一些奇怪的东西在继续。这是我为课堂项目提供的“成绩”课程:

#pragma once
#include <fstream>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Grade {
    private:
        string className;
        string student;
        string letter;

    public:
        Grade(string c, string s, string l) : className(c), student(s), letter(l) {}

        string getLetterGrade() const { return letter; }
        string getClassName() const { return className; }
        string getStudent() const { return student; }
        void setLetterGrade(string l) { letter = l; return;}
        void setClassName(string c) { className = c; return;}
        void setStudnet(string s) { student = s; return;}

        string toString() const { string output = "hello"+student; return output; }
};

显然,toString()方法目前不是我想要的。 如果我按上面那样运行toString(),我会按预期得到“hello529173860”。但是,如果我将行更改为:

string toString() const { string output = student+"hello"; return output; }

然后输出为“hello3860”。这不只是将hello字符串放在前面,而是在过程中用学生字符串替换字符......不知怎的?

此外,如果我尝试使用:

string toString() const { string output = "hello"+" world"; return output; }

我收到错误:

Grade.h: In member function ‘std::string Grade::toString() const’:
Grade.h:29:53: error: invalid operands of types ‘const char [6]’ and ‘const char [7]’ to binary ‘operator+’
   string toString() const { string output = "hello"+" world"; return output; }
                                                     ^

我真的对这里发生的事情感到茫然...特别是因为我在程序的早期没有问题就完成了字符串连接。 我想要的是输出如下内容:

“学生+ [一些空格] +字母+ [一些空格] + className”

3 个答案:

答案 0 :(得分:8)

可以将std::string添加到任何内容(另一个std::string,双引号字符串文字,char)并提供直观的结果 如果您尝试将双引号字符串文字添加到另一个字符串文字或char,那么它将无法“正常工作”:

  • 添加到char或其他整数值的字符串文字将经历标准转换为const char*,然后添加到指针的任何数字都将沿着字面数移动:如果偏移量不在字符串文字内,那么如果取消引用(使用)结果指针,则会得到未定义的行为,

  • 即使在衰减到两个指针之后也无法添加两个字符串文字,因此您将收到编译时错误。

有时您会想要显式构建std::string,以便与其他值的连接按您的方式工作:例如: my_string = std::string("hello ") + my_const_char_ptr + '\n'

示例:

std::string s = "Hello";

s + " World"; // ok
"Hello " + s; // ok
"Hello " + "World"; // NOT ok - two string literals
s += " World"; // ok
s += " Goodbye " + "World"; // NOT ok - "+" evaluated before "+="
s += std::string(" Goodbye ") + "World"; // OK - right-hand-side no longer two literals
                                         // BUT may be slower than two "s +="

答案 1 :(得分:1)

字符数组没有运算符+所以很明显这个代码

string toString() const { string output = "hello"+" world"; return output; }

无效。

至于其他问题,这只是你的幻想,因为你甚至没有为自己做出证明问题的榜样。

答案 2 :(得分:0)

常量字符串"hello""world"只是类型const char*的编译时常量。就像你不能添加两个int指针一样:

int *p1, *p2;
p1+p1; // Error

您无法添加两个(const) char*个对象。这违反了C / C ++语言规则。如果必须连接两个const-char-pointers,可以将它们放在一起:

"hello"  "world"

如果将这些技术与宏一起使用,则此技术非常有用。例如:

// Over simplified
#define ONE(_x) _x
#define TWO(_x) _X

ONE("This is") TWO(" concatenation")

如果要添加两个(或更多)运行时C字符串,则必须使用strXXX函数(如strcat),或者更好地使用std::string