0

ここで基本的なCのことについて混乱しています。36バイトのバッファがあります。そして、そのバッファに 3 つのデータ バイトを書き込みたいと思います。それぞれの 12 バイトは、さまざまな関数から受信されます。簡単な (効率的ではないかもしれない) 方法として、私が行ったことは、それぞれ 12 バイトの 3 つの異なるバッファーを取得したことです。memcpy() を使用して、これらのバッファーにデータを書き込みます。次に、strcat 関数を使用して、それらを 35 バイトのバッファーに入れます。それを行う他の方法はありますか?

int main()  
{  
    typedef struct rtc_time_type{  
        int HOUR;  
        int MIN;  
        int SEC;  
    }RTC_TIME_Type;  

    RTC_TIME_Type pCurrentTime;  

    char mainbuff[36], buff1[12], char buff2[12], char buff3[12];  

    memset(mainbuff,0,36);  
    memset(buff1,0,12);  
    memset(buff1,0,12);  
    memset(buff1,0,12);  

    memcpy(buff1, /*int bytes received from some structure*/ pCuurentTime.HOUR);  
    memcpy(buff2, /*int bytes received from some structure*/ pCuurentTime.MIN);  
    memcpy(buff3, /*int bytes received from some structure*/ pCuurentTime.SEC);  

    strcat(mainbuff,buff1);  
    strcat(mainbuff,buff2);  
    strcat(mainbuff,buff3);  

    //send mainbuff on UART  
    UART_Tx_Buff(mainbuff);  

    return 0;  

}  
4

1 に答える 1

0

もちろん、別の方法もあります。

データは文字列ではなく、バイナリ データのようです。次に、 のような文字列関連の関数を安全に使用することはできません。strcat()文字列が入力として想定されているためです (つまり、0 文字が表示されると停止します)。

memcpy()宛先バッファの適切な場所に直接使用できるはずです。

char mainbuff[36];  

memcpy(mainbuff + 0 * 12, pCurrentTime.HOUR, 12);
memcpy(mainbuff + 1 * 12, pCurrentTime.MIN,  12);
memcpy(mainbuff + 2 * 12, pCurrentTime.SEC,  12);

//send mainbuff on UART  
UART_Tx_Buff(mainbuff, 36);

に欠落しているサイズ引数を追加し、サイズ引数memcpy()も指定したことに注意してくださいUART_Tx_Buff()。そうしないと、文字列を操作する必要があり、これには適していないためです。

の宣言が表示されていないpCurrentTimeため、構文が正しいかどうかを判断するのは困難です。その変数が (先頭pが示唆するように) ポインターである場合、ドット演算子の使用は機能しないことに注意してください。

于 2013-06-04T08:23:58.560 に答える