Forum: Mikrocontroller und Digitale Elektronik strcmp() Leerzeichen Problem


von jack (Gast)


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?

von Markus W. (Firma: guloshop.de) (m-w)


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...

von DirkB (Gast)


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.

von jack (Gast)


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?

von DirkB (Gast)


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.

von DirkB (Gast)


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.

von Markus W. (Firma: guloshop.de) (m-w)


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().

von jack (Gast)


Lesenswert?

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ß

von Karl H. (kbuchegg)


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.

von jack (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.