2015-12-24 34 views
1

有人可以指出下面的代碼中的錯誤。我使用了一種比較兩個字符串字符charcter和更新變量'u',然後將其與子字符串的長度進行比較的幼稚方法。如果這是真的,那麼變量'c'被更新一個單位。簡單的C++程序來計算子串的實例數

計劃在C++:

#include<iostream> 
#include<conio.h> 
#include<string.h> 

using namespace std; 

int main() 
{ 
char s[50],a[20]; 
cin.getline(s,50); 
cin.getline(a,20); 
//int l=strlen(s); 
int p=strlen(a); 
int i,c=0,j,u=0,k; 
for(i=0;s[i]!='\0';i++) 
{ 
     if(a[i]='\0') 

     {break;} 

     if(s[i]==a[0]) 
     { 
      for(j=i,k=0;a[k]!='\0';j++,k++) 
       { 
        if(s[j]==a[k]) 
        { 
         u++; 
         //continue; 
        } 
        //else 
        //break; 
       } 
        //cout<<endl<<u;                   
      if(u==p) 
      { 
       c++; 
      } 
     } 

    u=0; 

    } 
    cout<<endl<<"count "<<c; 
    getch(); 
} 

對於任何類型的輸入組合,我得到的輸出爲0

+2

你需要嘗試更多的縮小問題。使用調試器進行調試,或者讓程序在工作時輸出打印結果,以便更好地瞭解其內部工作原理。 –

+1

我推薦使用'std :: string',因爲它更安全,更具可讀性。 'std :: string'會動態增長,你不必檢查溢出字符數組或維護那個討厭的終止'\ 0'字符。 –

+2

@ThomasMatthews - 同樣,'std :: string'提供了'std :: string :: find',它將完成90%的工作。 –

回答

2

的問題是這一部分:

if (a[i] = '\0') 

{ 
    break; 
} 

首先,正在使用=而不是==,但這不是全部問題。請將a[i]更改爲s[i],或將整個區塊註釋掉。我不明白爲什麼它是需要的。

1

我的小費和我的編碼約定,以避免您使用=而不是==在你的錯誤:

if(a[i]='\0') 

是把右值操作數的左側和左值在右側,像這樣:

if ('\0' == a[i]) 

此約定將避免這樣的錯誤(你會得到一個編譯錯誤):

if ('\0' = a[i]) 

這個代碼將產生一個編譯錯誤:

Error C2106 '=': left operand must be l-value