2017-01-19 26 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