在C++中生成子串

在C++中生成子串,c++,algorithm,C++,Algorithm,我正在尝试生成fun这个词的所有子字符串 但它打印了两次,我不知道为什么 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 << en

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

但它打印了两次,我不知道为什么

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;
        }
    }
要设置的第二个参数是长度,而不是子字符串的结束索引

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

从索引0开始,选择长度为1的子字符串,然后选择长度为2的子字符串,然后选择长度为3的子字符串,依此类推 然后转到索引1并对其执行相同的操作,依此类推。当索引为1时,字符串的剩余长度为2,以防万一,因此我们必须运行循环直到长度为2

但它打印了两次,我不知道为什么

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;
        }
    }
如果你打印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);
        ...
请注意,substr只会在c之后添加尽可能多的字符,如果i比字符串中的剩余字符长,请参见

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


听起来您可能需要学习如何使用调试器逐步完成代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它偏离预期的地方。这是一个必要的工具,如果你要做任何编程。进一步阅读:再看一看你的文档。第二个参数是长度,而不是结束索引。如果使用C++,而不是C,则应尽可能在最有限的范围内声明变量。@第一步嘿,这是我的评论!!!请别忘了把简历传下去
c,i: 01
f
c,i: 02
fu 
c,i: 03
fun
c,i: 12
un
c,i: 13
un
c,i: 23
n