
Zitat von
Moppi
Das
if() funktioniert:
Code:
if (strlen(strupwd) == strlen(website_upwd)
&& strcmp(strupwd, website_upwd ) == 0) .....
Wenn die Eingangsstrings korrekt sind. Also 12456 und 1234567, wird korrekt als falsch erkannt, sowie 123456 und 123456 als richtig.
Also musst Du davor nach dem Problem suchen.
Ich tippe hier auf das Problem, habe ich noch nicht richtig angeschaut:
Code:
cstringarg(strinput, "upwd", strupwd); // upwd
hallo,
das cstringarg habe ich als isolierte Funktion mit mehreren Teststrings geprüft, es hat immer den richtigen arg-Teilstring zurückgegeben, aber ich kann tatsächlich nicht ausschleißen, dass nicht doch irgendein verdeckter Bug drin steckt.
Du hast ja auch völlig Recht, die Abfrage
if (strlen(strupwd) == strlen(website_upwd)
müsste diesen Fehler 12345 != 1234567 heraussieben.
Die Ungleichheit "1245" != "12345" etc wird ja hingegen korrekt erkannt., und die Gleichheit "12345" == "12345" ebenfalls.
Es sei denn die Länge wird nicht richtig ermittelt, z.B. wegen fehlender '\0' in den beiden cstrings (wofür ich allerdings auch keinen Anhaltspunkt habe),
oder die Funktion macht bereits einen Vergleich auf Identität, ohne dass bereits "Enter" gedrückt wurde, und überspringt dabei die folgenden Eingaben - doch auch dafür sehe ich keinen Anlass.
Es ist mir ein absolutes Rätsel.
- - - Aktualisiert - - -
update:
hier ein testcode für cstringarg(), und er funktioniert bestens, sowohl mit direkt aneinanderhängenden als auch bei durch (fälschlich) mit Leerzeichen getrennten Teilstrings:
Code:
int16_t strstrpos(char * haystack, char * needle) // find 1st occurance of substr in str
{
char *p = strstr(haystack, needle);
if (p) return p - haystack;
return -1; // Not found = -1.
}
//----------------------------------------------------------------------------
const int MAXLEN = 1024;
const int TOKLEN = 64;
char * cstringarg( char* haystack, char* vname, char* sarg ) {
int i=0, pos=-1;
unsigned char ch=0xff;
char kini[3] = "&"; // start of varname: '&':
char kequ[3] = "="; // end of varname, start of argument: '='
char needle[TOKLEN]=""; // complete pattern: &varname=abc1234
//kequ[0] = '='; // customize
strcpy(sarg,"");
strcpy(needle, kini);
strcat(needle, vname);
strcat(needle, kequ);
pos = strstrpos(haystack, needle);
if(pos==-1) return sarg;
pos=pos+strlen(vname)+2; // start of value = kini+vname+kequ
while( (ch!='&')&&(ch!='\0') ) {
ch=haystack[pos+i];
if( (ch=='&')||(ch==';')||(ch==' ')||(ch=='\0') ||(ch=='\n')
||(i+pos>=strlen(haystack))||(i>TOKLEN-1) ) {
sarg[i]='\0';
return sarg;
}
if( (ch!='&') ) {
sarg[i]=ch;
i++;
}
}
return sarg;
}
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println("Test mit cstringarg()");
Serial.println();
char htmlstring[1024]="html teststring mit und ohne Leerzeichen &upwd1=testupwd1&upwd2=testupwd2 &upwd13=testupwd13&upwd224=testupwd224 EndeTststring";
char argstring[64]="";
cstringarg(htmlstring, "upwd1", argstring);
Serial.print("upwd1 >>"); Serial.print(argstring); Serial.println("<< soll: >>testupwd1<<");
cstringarg(htmlstring, "upwd2", argstring);
Serial.print("upwd2 >>"); Serial.print(argstring); Serial.println("<< soll: >>testupwd2<<");
cstringarg(htmlstring, "upwd13", argstring);
Serial.print("upwd13 >>"); Serial.print(argstring); Serial.println("<< soll: >>testupwd13<<");
cstringarg(htmlstring, "upwd224", argstring);
Serial.print("upwd224 >>"); Serial.print(argstring); Serial.println("<< soll: >>testupwd224<<");
}
void loop() {
}
das einzige, was ich vermuten würde, wäre daher etwas in der "Logik", wie die html-Seite aufgebaut ist und wie ihr html string mit dem Text der Eingabefelder zusammengesetzt, gesendet und ausgewertet wird.
Lesezeichen