2015-05-13 25 views
2

所以我需要計算一個字符串在一個字符串內多少次。我看到有人早些時候發佈了一個更復雜的版本,但我的任務需要我無法使用庫,必須手動完成。檢查每個字符串中有多少字符串在字符串中(簡化)

下面我創建一個程序,它會查找長字符串中每個短字符串的開始。

讓我們假設該

string longword = "bigbigbiggbigbigbiig; 
string shortword = "big" ; 
for (int i = 0; i < 20;) 
      { 
       for(int j = 0; j < 3; j++) 
       { 
        if(longword[i]==shortword[j]) 
        { 
         i++; 
        } 


       } 
       cout << (i-(shortword)+1) << ", "; 
      } 

我的問題是輸出下面有時它讀取像三字連續,或連續GGG。你可以看到它的工作原理,直到它結束輸出它開始於0,3,6,10,13,15,17問題是它一直運行正常,直到6,然後它讀取7,並將錯誤的起始位置放在那裏。

我在做什麼錯了?問題是我通常不能使用高級庫和代碼來按照指示進行操作。

謝謝!

+1

分割成幾部分的問題。首先編寫一個函數,在字符串中找到一個子串並返回它的位置。一旦你有了它(並測試了它),你的問題就會大大簡化。 – vsoftco

+0

順便說一句,這個問題也可以措辭,「找到一個字符串中子字符串的出現次數。」使用該措詞可能會幫助您找到搜索結果。 – jpaugh

+0

「...我的任務要求我不能使用庫...」+「字符串長字」似乎與此相矛盾,或者你授予了你的教師的緯度使用'std :: string',部分是標準庫?如果你的類只允許使用'std :: string' *及其成員*,後者應該*非常*,特別是['find()'](http://en.cppreference.com/w/cpp/string/basic_string的/發現)。 – WhozCraig

回答

3

如果性能是不是一個問題,你可以用下面的代碼

string longword = "bigbigbiggbigbigbiig; 
string shortword = "big" ; 
for (int i = 0; i < longword.size(); ++i) 
{ 
    bool found = true; 
    for(int j = 0; j < shortword.size(); ++j) 
    { 
     if(longword[i + j]!=shortword[j]) 
     { 
      found = false; 
      break; 
     } 
    } 
    if (found) cout << i << ", "; 
} 

如果你所關心的性能開始,你可以搜索克努特莫里斯普拉特算法或字符串搜索類似的主題。

0

如果我允許修補程序..

#include<iostream> 

using namespace std; 
int main() 
{ 
char longword[] = "bigbigbiggbigbigbiig"; 
char shortword[] = "big" ; 
int i=0,j=0,k=0,l=0; 
while(longword[i]!='\0') 
{ 
    j=0; 
    k=0; 
    while(shortword[j]!='\0') 
    { 
     if(shortword[j]==longword[i]) 
     { 
      k++; 
      j++; 
      i++; 
     } 
     else 
      j++; 
    } 
    if(k==3) 
     l++; 
} 
cout<<l; 
}