0

您好,我正在使用 xc8 compiler.sprintf 处理 Pic18f46k22 功能无法正常工作。我的代码是:

    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
4

1 回答 1

2

您将 7 个字符(六个'z's + one '\0')放入六个字符数组中。您需要为空终止符留出空间。

您需要声明L1Buffer持有 7 个字符:

unsigned char L1Buffer[7];

在您的情况下,L1BufferL2Buffer在内存中相邻放置。将 "zzzzzz" 写入L1Buffer6和'z's 的位置,因为它恰好位于它旁边: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-'

请注意,s 之后没有终止符'z',因此sprintf(TotalBuffer,"L1:%s L2:%s",L1Buffer,L2Buffer);取值L1Buffer直到在 .s 的末尾遇到 nul终止符L2Buffer。这就是为什么你得到zzzzzzaaaa3.

于 2017-01-19T08:45:24.963 回答