在c++中生成子字符串

Generating substrings in c++

本文关键字:字符串 c++      更新时间:2023-10-16

我正在尝试生成单词fun的所有子字符串。

但是它打印了两次"un",我不知道为什么。

int c, i;
    string s = "fun";
    for (c = 0; c < s.length(); c++)
    {
        for (i = c+1; i <= s.length(); i++)
        {
            string d = s.substr(c, i);
            cout << d << endl;
        }
    }

substr的第二个参数是length,而不是子字符串的结束index

您可以使用以下逻辑来获取所有子字符串:

  • 从索引0开始,选择长度为1的子串,然后是长度为2的子串,然后是3的子串,以此类推
  • 然后移动到索引1并对其执行相同的操作,依此类推。(当索引为1时,字符串的剩余长度为2,如果是fun,那么我们必须运行循环直到长度为2)

    string s = "fun";
    for (int c = 0; c < s.length(); c++)
    {
        for (int i = 1; i <= s.length() - c; i++)
        {
            string d = s.substr(c, i);
            cout << d << endl;
        }
    }
    

但是它打印了两次"un",我不知道为什么。

如果你输出c和I,你就会知道为什么了
    ...
    for (i = c+1; i <= s.length(); i++)
    {
        cout << "c,i: " << c << i << endl; // add this line to debug !
        string d = s.substr(c, i);
        ...

输出:

c,i: 01
f
c,i: 02
fu 
c,i: 03
fun
c,i: 12
un
c,i: 13
un
c,i: 23
n

请注意,如果i比字符串中的剩余字符长,则substr将在c之后添加尽可能多的字符,如http://www.cplusplus.com/reference/string/string/substr/

子字符串中包含的字符数(如果字符串较短,则使用尽可能多的字符)。