2016-03-19 4 views
1

Почему я не могу использовать это?О состоянии завершения цикла for-loop

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

Смежные вопросы