PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C: Stringvergleich bringt nicht 0 obwohl beide Strings identisch sind?


mf_2
2004-02-16, 17:19:04
Hallo,

Ich habe ein Problem:

Der User muss in ein Eingabefeld ( scanf() ) ein Wort eingeben. In einer Datei stehen dann die richtigen ( vom Programm erwarteten ) Zeichenketten untereinander. Diese werden mit fgets() ausgelesen. Allerdings immer nur eine Zeile. Dann wird die Eingabe und der String aus der Datei verglichen. Wenn sie gleich sind, wird eine Meldung "Richtig" ausgegeben, andernfalls ein "Falsch!". Das klappt auch ganz gut solange kein Leerezeichen im String ist, der aus der Datei ausgelesen wird.
Dann sagt mir das Programm auch bei der Eingabe der richtigen Lösung "Falsch!" an. Bei der Falsch-Ausgabe wird auch immer der richtige String ( der aus der Datei ) angezeigt. Bei meinem Problem gebe ich dann einen String ( mit Leerezeichen irgendwo in der Mitte ) ein und bekomme dann "Falsch!§´" und als richtige Lösung wird genau der String angezeigt, den ich eingegeben habe! dann kann er doch nicht falsch sein, oder?
Kennt ihr euch da besser aus als ich und könnt ihr mir weiterhelfen?

Godmode
2004-02-16, 17:23:55
könntest du mal den Code posten, weil so ist es schwierg auf den Fehler zu kommen!

mf_2
2004-02-16, 17:53:07
Hier ist der Code:

datei.txt enthält die Begriffe.

FILE *fp;
char buffer_komplett[255];
char eingabe[128];

main()

{

fp = fopen(datei.txt, "r");
fgets(buffer_komplett,255,fp);

printf("# Ihre Eingabe";
printf(" Loesung: ");
scanf("%s", eingabe);
if ( strcmp(buffer_komplett,eingabe) == 0 )
{

printf("# Richtig! Weiter mit einer beliebigen Taste!");
getchar();
getchar();

}
if ( strcmp(buffer_komplett,eingabe) != 0 )
{

printf("# Falsch! Die Loesung ist: %s. Weiter mit einer beliebigen Taste!",buffer_komplett);
getchar();
getchar();

}

}

Brillus
2004-02-16, 17:57:37
ich kenn mich mit scanf nicht genau aus aber teste mal nach ob der mal wie cin einfach bei einen Leerzeichen aufhört zu lesen also einfach ein prog schreiben das was einliest und es dann wieder ausgibt. Dann kannst du feststellen ob es nach dem Leerzeichen abbricht.

Einfachkrank
2004-02-16, 18:28:28
Also was das scanf() in Verwendung mit %s betrifft, kann ich euch sagen, dass es mit Leerzeichen so viel einließt, wie in den String passt oder die Eingabe zu ende ist. In dem Fall nicht mehr als 127 Zeichen...

mf_2
2004-02-16, 18:32:39
Es scheint wohl doch an den Leerzeichen zu liegen.

Ich hab mal n kleines Script geschrieben:


#include <stdio.h>

char eingabe[255];

int main()
{
printf("Hallo!\n");
scanf("%s",&eingabe);
printf("%s",eingabe);
getchar();
getchar();
return 0;
}


wenn ich "ein" eingebe, arbeitet das Programm normal, wenn ich hingegen "ein string" eingebe, verschwindet das textfenster einfach nach dem abschliessenden druck auf return.

Gnafoo
2004-02-16, 23:59:50
Scanf liest bei %s nur bis zum nächsten Space ein.
Was du willst ist eher so etwas:


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
char buffer[255];

// gets anstatt fgets kann zu buffer overflow führen
// also sollte man fgets mit stdin verwenden
fgets(buffer, 255, stdin);

printf("%s\n", buffer);

return(0);
}


cu DerTod

mf_2
2004-02-17, 14:16:32
Danke, jetzt funzt es!

mf_2
2004-02-17, 14:23:48
Update: Nunja, mein Testscript funzt jetzt, aber im Hauptscript geht der Vergleich immer ncoh nicht.

EDIT: Wie es scheint, wird immer ein Neuzeilezeichen an den eingegeben string angehängt, wie kann ich das verhindern?

Obligaron
2004-02-17, 14:34:31
char strEingabe[200] = "testeingabe\n";
if(strEingabe[strlen(strEingabe)-1]=='\n')
strEingabe[strlen(strEingabe)-1]='\0';
Abfrage ob letztes Zeichen im String ein \n ist, falls ja, dann mit String mit \0 abschliessen.

mf_2
2004-02-17, 16:36:04
Thx, jetzt gehts!