2016-09-06 109 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/

要包含在子字符串中的字符數(如果字符串較短,則使用盡可能多的字符)。