2017-01-19 14 views
0

こんにちは私はxc8 compiler.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の文字列はnullで終了します! –

+0

私はいくつかの方法を試しましたが、私は失敗です。 –

答えて

1

あなたは6つの文字配列に7つの文字(6つの'z' S + 1 '\0')を入れています。 nullターミネータのスペースを考慮する必要があります。あなたが7つの文字を保持するL1Bufferを宣言する必要があり

:あなたのケースでは

unsigned char L1Buffer[7]; 

は、L1BufferL2Bufferは、メモリ内に隣接して配置されています。

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

その後、L2Bufferが上書きされています:

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

注意があります、それにすぐ隣に位置するように起こるように、L2Buffer[0]L1Buffer'\0'L1Buffer場所6つの'z' Sに "zzzzzz" を書き込みます'z'sの後にターミネーターがないので、は、L2Bufferの終わりにヌルターミネーターに出会うまで、L1Bufferの値をとります。だからあなたはzzzzzzaaaa3を得る。

関連する問題