2016-09-06 110 views
-2

我试图生成单词fun的所有子字符串。在C++中生成子字符串

但它打印“联合国”两次,我不知道为什么。

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; 
     } 
    } 
+5

这听起来像你可能需要学习如何使用调试器来遍历你的代码。使用一个好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏离的位置。如果你打算做任何编程,这是一个重要的工具。进一步阅读:** [如何调试小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** –

+2

再次查看['' substr'](http://en.cppreference.com/w/cpp/string/basic_string/substr)。第二个参数是* length *,而不是结束索引之后。 – jaggedSpire

+2

如果您使用C++而不是C,则应尽可能在最有限的范围内声明变量。 – Slava

回答

1

substr第二个参数是长度,而不是结束子串的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; 
        } 
    } 
    
0

但它打印“联合国“两次,我不知道为什么。

你可以找到为什么如果你打印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 

需要注意的是,SUBSTR只会Ç之后添加尽可能多的字符越好,如果i比您字符串中的其余字符长,请按照http://www.cplusplus.com/reference/string/string/substr/

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