2016-04-19 8 views
0

Ich verstehe nicht, was genau passiert in dem Code unten in der Strncmp-Funktion. Warum ist es (all+j*100)+i?Brauchen Sie Hilfe zu verstehen, was Strncmp-Funktion in For-Schleife macht

/* Search jth string in char all[][100] for *pat*/ 
int PatternSearch(int j, char *all, char *pat) 
{ 

    int i; 

    for (i=0; i < strlen(all+j*100); i++) 
    { 
     if (strncmp(pat, ((all+j*100)+i), strlen(pat)) == 0) 
     { 
      return(i); // *pat found at ith byte of all[j] 
     } 
    } 

    return(-1); // *pat not found in all[j] 
} 

Es wäre schön, wenn mir jemand im Detail erklären könnte, was in der for-Schleife vor sich geht.

+1

Ich habe dieses Gefühl, dass Sie die Person fragen sollten, die 'PatternSearch' implementiert hat. Das heißt, sein Kommentar ist ziemlich klar. –

+1

Es ist ein verschleierter Weg, die Funktion 'char (* all) [100]' zu nehmen und 'all [j] [i]' in der Schleife zu verwenden. –

Antwort

-1

Der Kommentar in der ersten Zeile erklärt alles. Das Array all ist in Blöcke von 100 Zeichen unterteilt, und das Argument j gibt an, aus welchem ​​Chunk das Muster zu suchen ist. Die strncmp wird auf alle Positionen beginnend am Anfang des j ten Chunks bis zum Ende des Arrays angewendet. Der Rückgabewert ist der Offset des Zeichens, in dem das Muster relativ zum Anfang des j ten Chunks gefunden wird.


Was (all+j*100)+i macht?

Die j*100 erhält den Index des ersten Elements der j th Stück des Arrays. Das heißt, wenn j 2 ist, erhält es 200, was der Index des ersten Elements des zweiten Chunks ist (der Chunk am Anfang ist der zeroth Chunk).

all+j*100 ist die gleiche wie &all[j*100], so ist es nur den Zeiger auf das Element immer (oder den Anfang des Blocks) über die wir gesprochen, in diesem Fall &all[200].

Schließlich wird die +i wird Inkrementieren des Zeigers durch i und als i ist der Iterator der Schleife wird zunächst der Eingang strncmp() passieren &all[200] sein, und dann &all[201] und dann &all[202] und so weiter, bis das Muster gefunden wird, oder Das Ende des Arrays erreicht.

Die Wahl des Literals 100 und seine Verwendung, um das Array in Stücke zu unterteilen, scheint eine Wahl zu sein, die vom Programmierer der Funktion getroffen wurde. Es ist wirklich nicht erforderlich, Sie könnten die Funktion immer mit j=0 aufrufen und die Suche nach dem Muster würde normal ausgeführt werden, ohne diese 100 für irgendetwas zu verwenden. Aber der Programmierer wusste wahrscheinlich, dass die Muster in seinen Arrays immer ein paar hundert Zeichen in dem Array gefunden wurden, so dass er dem Anrufer die Möglichkeit gab, nach dem Muster zu suchen, das die Anordnung schneller findet.


Beispiel - Stellen Sie sich eine wörtliche 5 statt 100 der Einfachheit halber mit:

arr = "abcdefghijklm"; 
pat = "gh"; 

Wenn das Argument als j=0 geben wird, wird der erste strncmp in der Schleife mit &arr[0] suchen aufgerufen werden an der 'a' Zeichen, die zweite mit &arr[1] Blick auf 'b' und so weiter, bis das Muster gefunden wird. Es wird auf 'g' (&arr[6]) gefunden werden, so dass die Rückkehr 6 sein wird.

Wenn das Argument als j=1 übergeben wird, wird die erste strncmp in der Schleife mit &arr[5] am 'f' Zeichen suchen aufgerufen werden, der zweite mit Blick auf &arr[6]'b' wo das Muster gefunden wird, und so wird 1 zurückgegeben werden.

+0

Kannst du erklären, was '(all + j * 100) + i) 'tun? Warum multiplizieren wir um 100 und was macht das + ich? –

+0

Bearbeitete die Antwort mit einem Abschnitt, der explizit Ihre Frage beantwortet. – atturri

Verwandte Themen