与字符连接时,字符串连接不起作用

时间:2020-10-12 10:33:48

标签: c++

我尝试了以下操作: 计数序列是从以下开始的整数序列:

1、11、21、1211、111221,... 1被读为1或11。 11被读出为两个1或21。

21读为1,然后是1或1211。

给出一个整数n,生成第n个序列。

我实际上写了一些代码来解决这个问题,但是并没有产生正确的答案。代码中的问题是我试图使用“ +”运算符在字符串中添加一个字符。

string Solution::countAndSay(int A)
{
    string s = "11";
    string str;

    string ans[A + 2];
    ans[1] = "1";
    ans[2] = "11";

    int count = 1;

    for (int j = 3; j <= A; j++) {
        str = "";
        count = 1;

        for (int i = 0; i < s.size() - 1; i++) {
            if (s[i] == s[i + 1])
                count++;
            else {
                str += to_string(count) + s[i];
                count = 1;
            }
        }

        if (s[s.size() - 1] != s[s.size() - 2]) {
            str += "1" + s[s.size() - 1];
        }
        else
            str += to_string(count) + s[s.size() - 1];

        ans[j] = str;
        s = str;
    }
    return ans[A];
}

当我在嵌套循环中的以下if条件内更改代码时,它起作用了。我所做的更改是:

if(s[s.size()-1]!=s[s.size()-2]){
    str+="1";
    str.push_back(s[s.size() - 1)];
}

我只想知道早期代码中的错误。我们不能使用“ +”运算符在字符串中添加字符吗?

1 个答案:

答案 0 :(得分:1)

str += "1" + s[s.size() - 1];

不是不是是指

str += "1";
str += s[s.size() - 1];

但是

str += ("1" + s[s.size() - 1]);

右侧表达根本不是您想要的。

  1. 表达式"1"不是一个char,而是一个包含两个字符{'1', 0}的字符串文字(它是C字符串,所以有一个空终止符)。

  2. 然后,"1" + ...不同于您的顶级操作,因为C字符串没有重载的运算符,而只是衰减到指针。

  3. 现在您正在执行指针算术,因此s[s.size() - 1]从一个字符提升为一个整数,并添加到字符串文字中第一个字符的地址。

    除非字符为01(并且我不是说'0''1'),否则结果不在字符串文字的结尾,并且行为将是不确定的。

  4. str += (...)现在正在附加一个C字符串,甚至不能查看它(由于上述UB)。

原因

str += to_string(count) + s[i];

起作用的原因是to_string(count) + s[i]的左侧是一个std::string,其中的operator+已重载。您可以通过写作获得相同的效果

str += string{"1"} + s[s.size() - 1];

因此,在std::string的左侧,您还有一个operator+而不是C字符串文字。

相关问题