Search code examples
xc8

Sprintf Does not work properly


Hello I am working on Pic18f46k22 with xc8 compiler.sprintf Function does not work properly. My code is:

    const char *DATA[4] = {"xxxxxx","yyyyyy","zzzzzz","aaaa"}
    unsigned char Data1=2;
    unsigned char Data2=3;
    char L1Buffer[6];
    char L2Buffer[6];
    char TotalBuffer[20];


    for(int i=0;i<6;i++){L1Buffer[i]=0;L2Buffer[i]=0;}
    for(int i=0;i<20;i++){TotalBuffer[i]=0;}

    sprintf (L1Buffer,"%s", DATA[Data1]);
    sprintf (L2Buffer,"%s%d", DATA[Data2],Data2);
    sprintf(TotalBuffer,"L1:%s L2:%s",L1Buffer,L2Buffer);

    Lcd_Set_Cursor(2,1);
    printf("%s",TotalBuffer);

    Lcd_Set_Cursor(3,1);
    printf("%s",L2Buffer);

Output :

L1:zzzzzzaaaa3 L2:aa
aaaa3

Expected output :

L1:zzzzzz L2:aaaa3
aaaa3

Solution

  • You are putting 7 characters (six 'z's + one '\0') into six character array. You need to take space for null terminator into account.

    You need to declare L1Buffer to hold 7 characters:

    unsigned char L1Buffer[7];
    

    In your case, L1Buffer and L2Buffer are placed adjacent in memory. Writing "zzzzzz" into L1Buffer places six 'z's in L1Buffer and '\0' into L2Buffer[0], as it happens to be located right next to it:

     z z z z z z\0 . . . . .
    `-L1Buffer-'`-L2Buffer-'
    

    Then, L2Buffer is overwritten:

     z z z z z z a a a a 3\0
    `-L1Buffer-'`-L2Buffer-'
    

    Note there's no terminator after 'z's, so sprintf(TotalBuffer,"L1:%s L2:%s",L1Buffer,L2Buffer); takes L1Buffer values until it encounters nul lterminator at the end of L2Buffer. That's why you get zzzzzzaaaa3.