2012-04-10 15 views
0

Ich machte eine while-Schleife in einem Programm und das Programm erreicht die While-Schleife, aber es wird nicht ausgeführt. Ich habe das Gefühl, dass es einen sehr kleinen Fehler gibt, den ich vermisse, seit ich den Code so lange angeschaut habe.While-Schleife nicht ausgeführt

int strbuf = 100; 
    char string[strbuf]; 
    char *exit = "exit"; 
    while(!strcmp(string, exit)){ 
     printf("Enter a word to search. Enter exit to quit"); 
     scanf("%s", string); 
     state = present(fIndex, string); 
     if(state){ 
     printf("The word %s was found on line %d", string, state); 
    } 
} 

EDIT: Die Eingabe erfolgt über die Tastatur. EDIT EDIT: NEW CODE (gleiches Problem)

int strbuf = 100; 
char string[strbuf]; 
char *exit = "exit"; 

printf("Enter a word to search. Enter exit to quit\n"); 
scanf("%s", string); 
    while(!strcmp(string, exit)){ 
    state = present(fIndex, string); 
    if(state){ 
     printf("The word %s was found on line %d", string, state); 
    } 
    else printf("The word %s was not found", string); 
} 
+1

Soll nicht die Eingabe vor der while-Schleife einmal erfolgen? 'string' hat anfangs auf der ersten Schleife Iteration. – Mahesh

Antwort

3

Manpage für strcmp lesen:

Die Funktion strcmp() die beiden Strings s1 und s2 vergleicht. Es gibt eine ganze Zahl kleiner als, gleich oder größer als Null zurück, wenn s1 gefunden wird, , jeweils kleiner als, zu sein, oder größer als s2.

Wenn Sie ein Spiel haben, wird strcmp 0 zurück, und wenn die beiden Strings nicht Spiel tun werde es einen Wert ungleich Null zurück.

Daher while(!strcmp(string, exit)) ist wirklich zu sagen, während die Zeichenfolgen übereinstimmen, weiter zu loopen.

string ist auch nicht initialisiert und enthält Junk, was zu undefiniertem Verhalten führt. Initialisieren Sie es entweder zuerst oder verwenden Sie eine -Schleife, wenn Ihre Schleife mindestens einmal ausführen muss.

+1

Er ist verantwortlich dafür. Die Bedingung ist '! Strcmp (string, exit)'. – tnecniv

+0

Ein Wert von Null bedeutet, dass beide Zeichenfolgen gleich sind. Er möchte die Schleife so lange ausführen, wie es nicht der Fall ist, dass die Strings gleich sind. while (strcmp (string, exit)) wird ausgeführt, bis die Strings gleich sind. –

+0

@paxdiablo: Er hat 'while (! Strcmp (string, exit))', sollte es 'while (strcmp (string, exit))' oder 'while (strcmp (string, exit)! = 0') sein, did Ich habe etwas anderes falsch gelesen? Er möchte in der Schleife bleiben, bis der Benutzer "Exit" eingibt. Oder ist der Punkt, den Sie versuchen zu machen, dass er vor der Schleife Input nehmen sollte? – AusCBloke

0

Sie sind nicht Eingang immer für string, bevor es mit exit zu vergleichen. Setzen Sie a:

printf("Enter a word to search. Enter exit to quit"); 
scanf("%s", string); 

vor Ihrer while-Schleife.

+0

TROCKEN, TROCKEN, TROCKEN, TROCKEN, TROCKEN! :-) – paxdiablo

+0

eh ?? Gibt es etwas Sarkastisches bin nicht hier? – noMAD

+0

DRY = "Wiederholen Sie nicht" - Sie müssen vor der Schleife keine Eingabe vornehmen, wenn Sie die Zeichenfolge nur auf einen anderen Wert als "exit" setzen können. Die Tatsache, dass ich es fünf Mal gesagt habe, war selbst eine Form von Metastimmung, die jetzt durch die Tatsache, dass ich sie erklären musste, nutzlos geworden ist :-) Das ist okay, meine Frau versteht meine seltsame Art von Humor oft auch nicht . Denken Sie sich glücklich, dass Sie es nicht jeden Tag ertragen müssen. – paxdiablo

0

Wenn die while-Schleife nicht ausgeführt wird, bedeutet dies, !strcmp(string, exit) falsch ist

was bedeutet strcmp(string, exit) Tru sein (nicht 0)

STRCMP 0 auf eine Übereinstimmung gibt, so string ist nicht die gleiche wie exit

Der Grund dafür? Sie geben niemals einen Wert in string ein. Schlagen Sie vor, es in eine "Do While" -Schleife zu ändern.

1

Ja, es ist ist ausgeführt werden. Die Körper der while Schleife möglicherweise nicht ausgeführt, aber das ist, weil Sie tun, ist undefined Verhalten, mit string, bevor es zu etwas nützlich ist initialisiert.

Eine einfache Lösung ist, zu ändern:

char string[strbuf]; 

in:

char string[strbuf] = {'\0'}; 

Und aus Gründen der Lesbarkeit, sollten Sie Ihre Vergleiche erweitern, wenn sie nicht wirklich Boolesche Werte sind, (und, da du "exit" an einigen Stellen hart codierst, bin ich mir nicht sicher, warum du es als Variable haben würdest:

while (strcmp (string, "exit") != 0) { 
0

Außerdem ist exit() eine Standard-C-Funktion (siehe stdlib.h). Etwas wie strExit kann besser zu Ihren Zielen passen.