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?
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)
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
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.
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
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).
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.
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]) {
..........
}
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.
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
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
charbuf1[4]={'A','B','\0','C'};
2
charbuf2[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.
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"