2016-04-18 14 views
0

Ich versuche ein Programm zu erstellen, mit dem ich nach einem Namen in einer Textdatei suchen kann. An dieser Stelle wird das Programm mir erfolgreich mitteilen, ob der Name auf dem Dienstplan steht oder nicht, aber es wird auch jede zweite Zeile gedruckt! Zum Beispiel, wenn ich bin auf der Suche, um zu sehen, ob „Sarah“ auf der Liste sein wird, wird es sagenBeim Suchen und Drucken von Zeichenfolgen aus einer Datei wird jede Zeile gedruckt, anstatt die, die ich brauche

Sarah is not on the roster 
Sarah is number 7 on the roster 
Sarah is not on the roster 

Ich will es einfach, mir zu sagen, wenn „Sarah“ auf der Liste ist oder nicht. Ich bin sehr, sehr neu, mir C beizubringen, also gehe ich davon aus, dass ich etwas Dummes mache.

#include <stdio.h> 
#include <ctype.h> 
#include <string.h> 

int main(void) 
{ 
    FILE *inFile; 
    inFile = fopen("workroster.txt", "r"); 
    char rank[4], gname[20], bname[20]; 
    char name[20]; 

    printf("Enter a name: __"); 
    scanf("%s", name); 
    while(fscanf(inFile, "%s %s %s", rank, bname, gname)!= EOF)   
    { 
     if(strcmp(gname,name) == 0) 
      printf("%s is number %s on the roster\n", name, rank); 
     else 
      printf("%s is not on the roster\n", name); 
    } 
    fclose(inFile); 

    return 0; 
} 
+2

Das ist, weil Sie jedes Element (oder jede Zeile) betrachten und etwas sagen. Ihr Text sollte "Artikel # 1 ist nicht Sarah", "Artikel # 2 ist nicht Sarah", "Artikel # 3 ist Sarah" und so weiter sein. Bewahren Sie die Informationen in einer Variablen auf und verschieben Sie die print-Anweisung aus der Schleife, so dass sie nur einmal ausgeführt wird. –

Antwort

1

Sie brauchen, um zu verfolgen, ob die name war gefunden und drucken nur die „nicht auf der Liste“ Nachricht, wenn Sie die while Schleife zu beenden, ohne den Namen zu finden.

int found = 0; 
while(fscanf(inFile, "%s %s %s", rank, bname, gname)== 3)   
{ 
    if(strcmp(gname,name) == 0) 
    { 
     printf("%s is number %s on the roster\n", name, rank); 
     found = 1; 
    } 
} 

if (!found) 
    printf("%s is not on the roster\n", name); 
+1

Der '! = EOF' Test sollte' == 3' sein. – trojanfoe

+0

Danke, repariere das 'EOF'. Beachten Sie, dass ich dem 'strstr' zustimme, da zum Beispiel 'ali' mit 'alice' übereinstimmen würde. – user3386109

+0

Noch tue ich es jetzt. Ich habe das von meinem Kommentar entfernt. – trojanfoe

1

Sie können eine flag nehmen und prüfen, ob der Name oder nicht vorhanden ist.