Forum: PC-Programmierung strcmp immer falsch


von Benny (Gast)


Lesenswert?

Hallo,
ich habe zwei arrays, die ich gerne miteinander vergleichen möchte.
unsigned char password[4] = {'1', '2', '3', '4'};
unsigned char pasword_input[4] = {0};

im code lasse ich password_input beschreiben und sobald dieser voll ist 
vergleiche ich das mit password.
password_input wird ebenfalls mit '1', '2', '3', '4' beschrieben.
dann vergleiche ich die beiden mit
1
if(strcmp(password, password_input) == 0){
2
  uart_print("passwort ist korrekt");
3
}
4
else{
5
  uart_print("passwort ist nicht korrekt");
6
  for(k=0; k<=3; k++){
7
    uart_char_transmit(password[k]);
8
  }
9
  for(k=0; k<=3; k++){
10
    uart_char_transmit(password_input[k]);
11
  }
12
}

Wenn es also falsch ist, lasse ich mir beide Passwörter ausgeben. Diese 
gucke ich mir in HTerm an. Dabei sind beides ASCII und werden mir 
identisch angezeigt.

Wie bekomme ich es hin, dass mir strcmp eine 0 gibt? Also die beiden 
arrays gleich?

: Verschoben durch Admin
von Benny (Gast)


Lesenswert?

Vergessen, beim Kompilieren bekomme ich übrigendes immer die 
Fehlermeldungen

pointer targets in passing argument 1 of 'strcmp' differ in signedness 
[-Wpointer-sign]
pointer targets in passing argument 2 of 'strcmp' differ in signedness 
[-Wpointer-sign]

doch leider kann ich damit nichts anfangen (obwohl darin wahrscheinlich 
die lösung liegt)

von Sina A. (sinapse)


Lesenswert?

probier das mal mit

char password[5] = {'1', '2', '3', '4', 0}; //0 ohne anführungszeichen
char pasword_input[5] = {0};

verwende weiterhin nur 4 stellen

von klausr (Gast)


Lesenswert?

Benny schrieb:
> unsigned char password[4] = {'1', '2', '3', '4'};

strcmp vergleicht strings. Strings werden durch ein 0-Byte terminiert. 
Das fehlt bei dir!

char password[5] = {'1', '2', '3', '4', 0};

von Norbert (Gast)


Lesenswert?

Woher soll denn strcmp wissen wieviele Zeichen es vergleichen soll?

TIP: Ein String endet mit '\0'
Wo ist das in deinem array?

von Karl M. (Gast)


Lesenswert?

Nur gut dass man Strings vergleicht und immer auf das abschließende '\0
' achtet !

von klausr (Gast)


Lesenswert?

Sina A. schrieb:
> char pasword_input[5] = {0};

Hm. Das stimmt nicht: char password_input[4] = {0}, da ja C ab 0 zählt.

von Bristel (Gast)


Lesenswert?

Ersetze unsigned char durch char.

von M. K. (sylaina)


Lesenswert?

Benny schrieb:
> Vergessen, beim Kompilieren bekomme ich übrigendes immer die
> Fehlermeldungen
>
> pointer targets in passing argument 1 of 'strcmp' differ in signedness
> [-Wpointer-sign]
> pointer targets in passing argument 2 of 'strcmp' differ in signedness
> [-Wpointer-sign]

Google bemühen. Der Compiler sagt dir hier, dass strcmp ein Array aus 
dem Typ char erwartet er aber ein Array aus unsigned char bekommen hat.

von Sina A. (sinapse)


Lesenswert?

klausr schrieb:
> Sina A. schrieb:
>> char pasword_input[5] = {0};
>
> Hm. Das stimmt nicht: char password_input[4] = {0}, da ja C ab 0 zählt.

da wird ein array mit fünf chars definiert und alle einträge auf 0 
initialisiert

lg

von Herbert (Gast)


Lesenswert?

Sina A. schrieb:
> klausr schrieb:
>> Sina A. schrieb:
>>> char pasword_input[5] = {0};
>>
>> Hm. Das stimmt nicht: char password_input[4] = {0}, da ja C ab 0 zählt.
>
> da wird ein array mit fünf chars definiert und alle einträge auf 0
> initialisiert
>
> lg

Du hast wohl zu tief in Glas geschaut. Da wird natürlich ein Array mit 
vier (4) chars definiert und je mit 0 belegt. Der Index fürs Array 
läuft von 0 ... 3 (=4 Elemente).

von Herbert (Gast)


Lesenswert?

Herbert schrieb:
> char password_input[4] = {0}, da ja C ab 0 zählt.

Mein Kommentar bezog sich natürlich auf diese Zeile - Asche über mein 
Haupt.

von Benny (Gast)


Lesenswert?

Vielen dank, es hat funktioniert.

von Hans-Georg L. (h-g-l)


Lesenswert?

Alternativ hättest du in deinem Originalcode

if(strncmp(password, password_input, 4) == 0)

schreiben können.

von Der Andere (Gast)


Lesenswert?

Hans-Georg L. schrieb:
> Alternativ hättest du in deinem Originalcode
>
> if(strncmp(password, password_input, 4) == 0)
>
> schreiben können.

Und wie stellst du dir sowas praktisch vor? Im allgemeinen ist die 
Passwortlänge schon seit 30 Jahren nicht mehr festgelegt.

Was soll der Unfug einem Anfaänger einen unsinnigen Trick zu zeigen 
statt der korrekten Lösung?

@Benny: Maximal die ersten 2 Kapitel eines C Buchs hätten genügt deinen 
Fehler selbst zu finden.

von Joachim B. (jar)


Lesenswert?

man könnte ja auch memcmp nehmen

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

oder wenn es nur 4 Zeichen bleiben, padding aus ist für die arrays und 
ascii die Wahl ist.

if(*((uint32_t*)password) == ((uint32_t*)password_input)[0]) {
   ..........
}

: Bearbeitet durch User
von Hans-Georg L. (h-g-l)


Lesenswert?

Der Andere schrieb:
> Hans-Georg L. schrieb:
>> Alternativ hättest du in deinem Originalcode
>>
>> if(strncmp(password, password_input, 4) == 0)
>>
>> schreiben können.
>
> Und wie stellst du dir sowas praktisch vor? Im allgemeinen ist die
> Passwortlänge schon seit 30 Jahren nicht mehr festgelegt.
>

Der TO hat exakt 4 chars in seinem Code vergleichen wollen uns die
strnxxx Funktionen sind in C kein Trick sondern haben schon ihren Sinn.

von Joachim B. (jar)


Lesenswert?

Hans-Georg L. schrieb:
> Der TO hat exakt 4 chars in seinem Code vergleichen wollen uns die
> strnxxx Funktionen sind in C kein Trick sondern haben schon ihren Sinn.

genau wie memcmp, aber egal

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> Hans-Georg L. schrieb:
>> Der TO hat exakt 4 chars in seinem Code vergleichen wollen uns die
>> strnxxx Funktionen sind in C kein Trick sondern haben schon ihren Sinn.
>
> genau wie memcmp, aber egal

strncmp() und memcmp() kannst Du nicht allgemein als äquivalent ansehen:
1
char buf1[4] = { 'A', 'B', '\0', 'C' };
2
char buf2[4] = { 'A', 'B', '\0', 'D' };

strncmp (buf1, buf2, 4) liefert 0 zurück, memcmp (buf1, buf2, 4) jedoch 
-1. Beide Funktionen haben schon ihre Berechtigungen. In diesem 
konkreten Fall (Vergleich einer exakt vierstelligen Pin) passt es aber. 
Ja, memcmp() wäre hier sogar sinnvoller, wenn nicht nur druckbare 
Zeichen als Pin erlaubt sind.

: Bearbeitet durch Moderator
von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Beide Funktionen haben schon ihre Berechtigungen. In diesem
> konkreten Fall (Vergleich einer exakt vierstelligen Pin) passt es aber.

und geht es nicht genau darum? um diesen konkreten Fall?
nur memcmp kann genau 4 Bytes egal mit was gefüllt vergleichen, strncmp 
kann es nicht!

ich weiss nicht wer mich so abgrund tief hasst das ich bei derlei 
Postings immer "nicht lesenswert bekomme"

Beitrag "Re: strcmp immer falsch"

: Bearbeitet durch User
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.