Problem mit malloc()
-
Hi,
ich möchte ein Programm schreiben welches nach dem CaesarCode codiert.
Dazu lass ich zunächst einen Text eingeben und speicher diesen in
char* ptrEingabe;Der codierte Text soll in char* ptrCode gespeichert werden.
Die Code der das machen soll ist folgender
int len = strlen(ptrEingabe); int min = 0, max = 0; //Grenzen fuer AsciiCode char* ptrCode = (char*) malloc(len*sizeof(char)); for (int i = 0 ;i < len; i++) { tmpChar = ptrEingabe[i]; if (isalpha(tmpChar) == 0) //Buchstabe? { ptrCode[i] = ptrEingabe[i]; } else // Buchstabe { if (isupper(tmpChar) == 1) //Großbuchstabe? { min = 65; max = 90; } else //Kleinbuchstabe { min = 97; max = 122; } tmpChar = tmpChar + iCode%26; if (tmpChar > max) tmpChar = tmpChar - 26; ptrCode[i] = tmpChar; }
Der reservierte Speicherplatz fuer ptrCode ist immer größer als len.
AusDieses, ist ein Test!
Danke!aAzZ;wird
Glhvhv, lvw hlq Whvw!
Gdqnh!dDcC;
²²²²½½½½½½½½¯■
-
Du hast die abschließende 0 vergessen, die in C am Ende von einem String stehen muss, und die von strlen nicht mitgezählt wird. Ansonsten weiß bei der Ausgabe niemand, wo der String zuende sein soll, und es wird noch irgendwelcher Müll mitausgegeben, der zufällig dahinter im Speicher ist.
Du musst also ein Byte mehr reservieren und das auf 0 setzen.
int len = strlen(ptrEingabe); char *ptrCode = malloc(len + 1); if (!ptrCode) { fputs("oh noes!\n", stderr); exit(EXIT_FAILURE); } ptrCode[len] = 0; for (int i = 0; i < len; i++) /*...*/
-
ok ich probier das dann mal aus. Wusste nicht, dass strlen den nicht mitzählt.
Dankeschön!