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

    Dieses, 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!


Anmelden zum Antworten