Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用字符连接时字符串连接不起作用_C++ - Fatal编程技术网

C++ 使用字符连接时字符串连接不起作用

C++ 使用字符连接时字符串连接不起作用,c++,C++,我尝试了以下几点: count and say序列是从以下开始的整数序列: 1,11,21,121111221。。。 1被读出为1或11。 11被读出为两个1或21 21被读出为一个2,然后是一个1或1211 给定整数n,生成第n个序列 实际上,我编写了一些代码来解决这个问题,但它没有生成正确的答案。代码中的问题是,我试图使用“+”运算符将字符添加到字符串中 string Solution::countAndSay(int A) { string s = "11";

我尝试了以下几点: count and say序列是从以下开始的整数序列:

1,11,21,121111221。。。 1被读出为1或11。 11被读出为两个1或21

21被读出为一个2,然后是一个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];
}
我只是想知道早期代码中的错误。我们不能使用“+”运算符向字符串中添加字符吗

str += "1" + s[s.size() - 1];
并不意味着

但是

右手边的表情根本不是你想要的

  • 表达式
    “1”
    不是字符,而是包含两个字符
    {1',0}
    的字符串文字(它是C字符串,因此有空终止符)

  • 然后,
    “1”+…
    不像您的顶级操作那样是一个追加,因为C字符串没有重载运算符,只是衰减为指针

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

    除非字符是
    0
    1
    (我不是说
    '0'
    '1'
    ),否则结果将超出字符串文字的末尾,并且行为将未定义

  • str+=(…)
    现在添加了一个C字符串,这是非法的(由于上面的UB)

  • 原因是

    str += to_string(count) + s[i];
    
    工作原理是,
    to_string(count)+s[i]
    的左侧是一个带重载的
    std::string
    。你可以通过写作获得同样的效果

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

    因此,在
    操作符+
    “1”+s[s.size()-1]的左侧也有一个
    std::string
    而不是一个C字符串文本不会向字符串中添加字符,因为
    “1”
    不是字符串;)相反,它执行指针算术,因为
    “1”
    是指针。请参见此处:这是否回答了您的问题?
    str += ("1" + s[s.size() - 1]);
    
    str += to_string(count) + s[i];
    
    str += string{"1"} + s[s.size() - 1];