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