2015-08-08 104 views
3

我試圖使用一個字符串:插入一個字符的每N個字符,在C++改變n字符

std::string tokenize(const std::string& s) { 
    if (!s.size()) { 
    return ""; 
    } 
    std::stringstream ss; 
    ss << s[0]; 
    for (int i = 1; i < s.size(); i++) { // tried i++ ----> i+=16 
    ss << '|' << s[i]; 
    } 
    return ss.str(); 
} 
從( How to insert a character every N characters in a string in C++

但是從每一個字符的每一個16個字符改變插入"|"

我試圖改變i++ ---->i+=16但失敗,使"sqdfqdfqwerqwer"成爲"s|q"

有人能找到我的錯誤?

+0

你是新來'for'循環? –

+0

是的。我幾天前剛開始使用C++。 –

回答

3
for (int i = 1; i < s.size(); i+=16) { // tried i++ ----> i+=16 

    ss << '|' << s[i]; 
    } 

首先:

,但失敗了,使"sqdfqdfqwerqwer"成爲"s|q"

您正在從第一個位置(i=1)直接跳到給定字符串的第16個位置(i+=16),當循環第二次運行時位置在1+16位置。

因此ss越來越字符串s[0],s[i],s[i+16],s[2i+16]... 這就是爲什麼你正在被剝離的字符串s版本。

解決方案 這是相當簡單的,其上述

for (int i = 1; i < s.size(); i++) { 
    if (i%16==0) ss << '|'; <<-- this is the main concept you are missing 
    ss << s[i]; 
    } 
  • 我們遍歷所有的字符串

  • 檢查的字符已經回答了,如果我們在需要的位置。欲瞭解更多信息,請參閱Modulo操作員的工作原理。

  • 如果我們得到所需的位置,請執行您想要的操作。

現在,當我通過

DoesThisAnswerYourQuestion?ImGladItDid.IfNotITriedMybest:D

它打印出

DoesThisAnswerYo|urQuestion?ImGla|dItDid.IfNotITri|edMybest:D

1
for (int i = 1; i < s.size(); i++) { 
    if (i%16==0) ss << '|'; 
    ss << s[i]; 
    } 
+1

你能解釋一下錯誤是什麼嗎?我認爲這個問題就是這樣問的。 –

1

我試圖改變我++ ----> I + = 16,但失敗了,使 「sqdfqdfqwerqwer」 變成 「S | Q」

的錯誤是,你通過16增加你把第一個字符放到流中。然後你循環一次,並把|和下一個字符放入流中。然後你增加16,這導致i大於字符串的大小。因此,循環退出並顯示所提到的結果。

@ kirbyfan64os建議更正。快樂的編碼。

1

穿行,

ss << s[0]; 

第一個字符進入輸出流

for (int i = 1; 

在1

 i < s.size(); 

開始,一直持續到你達到或超過該字符串的結尾

 i++) 

看看每個元素的數組

ss << '|' << s[i]; 

放於|並將當前字符輸入到輸出流中。

所以對於 「ABC」 的循環將展開到:

ss << A;  //ss << s[0]; 
ss << | << B; //ss << '|' << s[1]; 
ss << | << C; //ss << '|' << s[2]; 

流內容是A | B | C

for (int i = 1; i < s.size(); i+=16) 

手段看一下第二個元素,每16個元素的字符串中後。換句話說,S [1],S [17],S [33],S [49] ...

所以對於 「sqdfqdfqwerqwer」 你把它展開爲:

ss << s;  //ss << s[0]; 
ss << | << q; //ss << '|' << s[1]; 

而且只有有字符串中有15個字符,所以沒有17個字符。輸出是:

s|q 

正如OP注意到的那樣。

好的。上次搞砸了,所以拿兩個。這可以通過串聯字符串而不用字符串緩衝區來完成,但stringstream可能是更快的選擇。不過,我不得不通過個人資料來證明這一點。我也做了一個快速的調整,允許調用者指定長度。它是用於測試,所以我把它在

std::string tokenize(const std::string& s, 
        size_t where) 
{ 
    if (s.size() > 0) 
    { 
     std::stringstream temp; 
     temp << s.substr(0,where); 
     for (size_t loc = where; loc < s.size(); loc+=where) 
     { 
      temp << '|' << s.substr(loc,where); 
     } 
     return temp.str(); 
    } 
    return ""; 
}   

結果:

In = "I'm the very model of a modern major general" 
Out = "I'm the very mod|el of a modern m|ajor general" 
+0

您提出的解決方案是覆蓋字符,而不是將它們插入字符之間。 – NathanOliver

+0

花了一點時間,但我確保這一次。實際上,我不知道的一件事是插入是在前還是後。跟在後面。 – user4581301

相關問題