2017-01-19 24 views
0

您好,我正在使用xc8編譯器..sprintf的Pic18f46k22功能無法正常工作。 我的代碼是:Sprintf無法正常工作

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); 

輸出:

L1:zzzzzzaaaa3 L2:aa 
aaaa3 

預期輸出:

L1:zzzzzz L2:aaaa3 
aaaa3 
+1

不要忘記爲''\ 0''字符分配空間。 C字符串是空的終止! –

+0

我嘗試了一些方法但我失敗了。 –

回答

1

你是把7個字符(6個'z' S +一個'\0')爲六個字符數組。考慮到空結束符需要空間。

您需要聲明L1Buffer持有7個字符:

unsigned char L1Buffer[7]; 

在你的情況,L1BufferL2Buffer被放置在內存中相鄰。寫 「ZZZZZZ」 到L1Buffer地方6個'z' S IN L1Buffer'\0'L2Buffer[0],正好緊挨着位於它:

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

然後,L2Buffer被覆蓋:

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

注有在'z' s之後沒有終止符,因此sprintf(TotalBuffer,"L1:%s L2:%s",L1Buffer,L2Buffer);需要L1Buffer值,直到它在L2Buffer的末尾遇到最終符號爲止。這就是爲什麼你得到zzzzzzaaaa3