2016-03-19 16 views
1

なぜこれを使用できないのですか?forループの終了条件について

for(int i=0; i<haystack.length()-needle.length()+1; i++) 

haystack = "abb" needle = "abaaa"のときにエラーが発生しました。私が使用している場合

それは誤りがない:

int diff=haystack.length()-needle.length()+1; 
for(int i=0; i<diff; i++) 

これは、関数である:

int strStr(string haystack, string needle){ 
     if(needle.length()==0) 
      return 0; 
     if(haystack.length()==0)// || haystack.length() < needle.length()) 
      return -1; 

     int diff=haystack.length()-needle.length()+1; 
     for(int i=0; i<(haystack.length()-needle.length()+1); i++){ 
     //for(int i=0; i<diff; i++){ 
//   printf("%d %d\n",haystack.length(),needle.length()); 
     for(int j=0; j<needle.length(); j++){ 
      if(haystack.at(i+j)!=needle.at(j)) 
      break; 

      if(j==needle.length()-1) 
      return i; 
     } 
     } 

     return -1; 
    } 
+2

'std :: string.length()'は符号なしの 'size_t'型の値を返します。引き算の結果、符号なし整数のオーバーフローが発生します。 – IGarFieldI

+0

@IGarFieldl取得しました。ありがとう! – dykw

答えて

3

あなたは符号なしlength()値に算術を適用している方法に起因する問題を見ています。変更:へ

for(int i=0; i<haystack.length()-needle.length()+1; i++) 

for(size_t i=0; i+needle.length()<=haystack.length(); i++) 

これはあなたの元の例では、負のアンダーフローを避け、左とポジティブ比較の右側の両方を保持します。

+1

入手しました。ありがとう! – dykw

関連する問題