Hi ich habe ein Problem und zwar will ich zwei Strings in C vergleichen diese beinhalten allerdings Leerzeichen und strcmp() kommt leider nicht mit Leerzeichen klar. Ich habe auch schon Google genutzt aber keine Lösung gefunden. Das einzige was mir einfällt das man strncmp() nimmt und die Strings jeweils vor und nach dem Leerzeichen zu vergleichen aber da muss es doch eine schnellere Möglichkeit geben. Hat jemand von euch mit soetwas Erfahrung gemacht?
jack schrieb: > Hi ich habe ein Problem und zwar will ich zwei Strings in C vergleichen > diese beinhalten allerdings Leerzeichen und strcmp() kommt leider nicht > mit Leerzeichen klar. Doch, strcmp() kommt sehr gut mit Leerzeichen klar. Warum auch nicht? Was genau hast du vor? Vielleicht helfen ein paar Beispiele...
Wieso kommt strcmp nicht mit Leerzeichen klar? Stürzt es ab oder gibt es falsche Ergebnisse? Wenn du eine Funktion suchst, die Leerzeichen ignoriert, dann musst du dir die selber schreiben. Ist nicht schwierig. Als Vorlage kannst du ja strcmp nehmen.
Hier eine Beispiel Konsolen Anwendung:
1 | #include <stdio.h> |
2 | #include <string.h> |
3 | |
4 | |
5 | int main() |
6 | {
|
7 | char answer[20]; |
8 | |
9 | scanf("%s", &answer); |
10 | |
11 | if(strcmp(answer, "OK OK") == 0) |
12 | {
|
13 | printf("ready"); |
14 | }
|
15 | else if(strcmp(answer, "ERROR ERROR") == 0) |
16 | {
|
17 | printf("set"); |
18 | }
|
19 | else
|
20 | {
|
21 | printf("else"); |
22 | }
|
23 | |
24 | return 0; |
25 | }
|
Wenn ich "OK OK" oder "ERROR ERROR" als Beispiel eingebe kommt immer else.. Lasse ich allerdings die Leerzeichen weg. Also vergleiche die Eingabe mit "OKOK" und "ERRORERROR" dann funktioniert es. Daher meine Aussage, das strcmp() nicht mit Leerzeichen klar kommt. Hat jmd ne Lösung oder nen Fehler entdeckt?
Das Problem ist nicht strcmp, sondern dein Unwissen über den Formatspecifier s bei scanf. s liest nur bis zu einem Whitespace (Leerzeichen, Tabulatoren, Zeilenvorschub) Zudem ist der Adressoperator & an der Stelle falsch.
1 | scanf("%s", answer); |
2 | printf("%s", answer); |
sollte klar machen was falsch läuft.
Achso, eine Lösung: gets ist unsicher fgets speichert das '\n' mit ab. Also doch scanf. Da gibts noch den [] Specifier.
1 | scanf("%19[^\n]", answer); |
Auch bei scanf solltest du die maximale Länge mit angeben. Sonst kannst du gleich gets nehmen.
DirkB schrieb: > Achso, eine Lösung: > gets ist unsicher > fgets speichert das '\n' mit ab. > > Also doch scanf. Da gibts noch den [] Specifier. > >
1 | scanf("%19[^\n]", answer); |
> Auch bei scanf solltest du die maximale Länge mit angeben. Sonst kannst > du gleich gets nehmen. Das will ich so unterschreiben. Wenn das Ganze auf einem Mikrocontroller laufen soll, wär ich mit scanf() aber eher vorsichtig, schluckt viel Leistung und Platz. Dann besser fgets() und memcmp() oder idealerweise mit strzcmp().
ich habe das selbe Problem aber auch mit einem Mikrocontrollerprojekt wo ich kein scanf verwende. Da lese ich die Zeichen byteweise ein und habe dort das selbe Problem. Gruß
jack schrieb: > ich habe das selbe Problem aber auch mit einem Mikrocontrollerprojekt wo > ich kein scanf verwende. Da lese ich die Zeichen byteweise ein und habe > dort das selbe Problem. Dein Problem ist nicht das Leerzeichen, sondern dass deine Einleseroutine wahrscheinlich den \n mit im String ablegt. Also: Die EIngabefunktion überprüfen. Zur Kontrolle den gelesenen String ausgeben lassen. Am besten mit einem Sonderzeichen davor und danach. Dann sieht man ob man einen Zeilenumbruch im String hat oder nicht. strcmp funktioniert perfekt. Egal ob mit oder ohne Leerzeichen. Nur sind deine Strings eben tatsächlich eben nicht Byte für Byte identisch.
Da sind keine "Sonderzeichen" vorhanden. Die werden nicht in den String geschrieben sondern einfach ignoriert. Habe mir das auch übers Terminal als Hex ausgeben lassen auf den ersten Blick sind sie identisch. Ich werde mir das morgen nochmal in aller Ruhe angucken und gegebenenfalls die komplette Routine posten. Vielen Dank und gute Nacht
jack schrieb: > Da sind keine "Sonderzeichen" vorhanden. Das kann ich von hier nicht beurteilen. Aber wenn strcmp sagt, dass die Strings nicht identisch sind, dann sind sie auch nicht identisch. Aber vielleicht benutzt du ja auch strcmp falsch. Das Ergebnis von strcmp ist 0, wenn die Strings identisch sind.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.