2016-03-19 4 views
1

Warum kann ich das nicht verwenden?Über den Beendigungszustand der For-Schleife

Ich habe Fehler, wenn haystack = "abb" Nadel = "abaaa".

Es hat keinen Fehler, wenn ich benutze:

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

Dies ist die Funktion:

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()' gibt einen Wert vom Typ 'size_t', die nicht signiert ist. Die Subtraktion führt dann zu einem vorzeichenlosen Integer-Überlauf – IGarFieldI

+0

@IGarFieldl Got it. Vielen Dank! – dykw

Antwort

3

Sie Probleme aufgrund der Art und Weise sehen Sie Arithmetik ohne Vorzeichen length() Werte anwenden. Wechsel:

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

zu:

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

Dies hält sowohl die linke und rechte Seite des Vergleichs positiv ist, den negativen Unterlauf in Ihrem ursprünglichen Beispiel vermieden werden.

+1

Verstanden. Vielen Dank! – dykw

Verwandte Themen