2 Stimmen

Strcmp funktioniert nicht für die Eingabezeichenfolge von fgets-Dateilesung

Ich lese Wörter aus einer Datei und muss nach bestimmten Wörtern suchen, unten ist mein Code

string lesen = malloc(50 * sizeof(char));

FILE* p = fopen("wort","r");

while(fgets(lesen,50,p))
{
    printf("%s\n",lesen);
    if(strcmp(lesen,"apfel") == 0)
     {
        printf("Apfel gefunden\n");
        break;
     }
}

Und die Beispieldatei 'wort' lautet wie folgt:

$: more word

liol
apfel
schere
groß
knall
mentalist
sünder
ziege
goti

Warum funktioniert strcmp in diesem Fall nicht, printf kann den String lesen ausgeben, also funktioniert der Zeiger auf Charaktere richtig.

10voto

paxdiablo Punkte 809679

Die fgets()-Funktion behält in den meisten Fällen das Zeilenumbruchszeichen am Ende der Zeile bei. Daher wird yourtext\n nicht gleich yourtext sein. Dies wäre dir möglicherweise aufgefallen, wenn du einen meiner Lieblingstricks zum Überprüfen von Strings verwendet hättest:

printf ("[%s]\n", read);

Das Vorhandensein eines Zeilenumbruchszeichens vor dem abschließenden ] hätte dich sofort auf das Problem aufmerksam gemacht oder zumindest die Augenbraue gehoben.

Wenn du das Zeilenumbruchszeichen entfernen möchtest, bevor du vergleichst, kannst du etwas wie das Folgende tun:

int ln = strlen (read);
if ((ln > 0) && (read[ln-1] == '\n'))
    read[ln-1] = '\0';

Alternativ könntest du das überspringen und einfach folgendes tun:

if (strcmp (read,"apple\n") == 0)

Es ist nicht unbedingt elegant, aber wenn du das Wort nur für diesen Vergleich benötigst, wird es vollkommen ausreichen.

Allerdings solltest du dann vielleicht darauf achten, ob die letzte Zeile in der Datei kein Zeilenumbruchszeichen am Ende hat, sodass es vielleicht besser ist, den obigen Code zum Entfernen des Zeilenumbruchs zu verwenden.

2voto

suspectus Punkte 15752

Um nach einem spezifischen String in der Zeile zu suchen, anstatt die gesamte Zeile abzugleichen, kann strncmp (das nach n Zeichen sucht) verwendet werden.

if (strncmp(read,"apple",strlen("apple")) == 0)
 {
    printf("Apfel gefunden\n");
    break;
 }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X