strcmp() Leerzeichen Problem

Gast #2829389
Lesenswert?

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?
(Firma: guloshop.de) #2829397
Lesenswert?

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...
Gast #2829400
Lesenswert?

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.
Gast #2829447
Lesenswert?

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?
Gast #2829449
Lesenswert?

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.
Gast #2829452
Lesenswert?

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.
(Firma: guloshop.de) #2829463
Lesenswert?

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().
#2829496
Lesenswert?

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.
Gast #2829501
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren