1

16 進数で埋められる配列 (readingreg[4]) があります。私の目標は、データ型を文字列に変換することです。いくつかの提案を読みましたが、sprintf が適しているようです。

これは私が試したものです:

sprintf(server0, "0x%02X", readingreg[0]);
printf("This is element 0: %s\n", server0);

sprintf(server1, "0x%02X", readingreg[1]);
printf("This is element 1: %s\n", server1);

sprintf(server2, "0x%02X", readingreg[2]);
printf("This is element 2: %s\n", server2);

sprintf(server3, "0x%02X", readingreg[3]);
printf("This is element 3: %s\n", server3);


printf("This is element 0: %s\n", server0);
printf("This is element 1: %s\n", server1);
printf("This is element 2: %s\n", server2);
printf("This is element 3: %s\n", server3);

ここに私の出力があります:

This is element 0: 0x4A
This is element 1: 0xAA
This is element 2: 0xAA
This is element 3: 0xA0
This is element 0: 0
This is element 1: A0
This is element 2: xA0
This is element 3: 0xA0

この時点で、私は sprintf が何をしてくれたかについてかなり混乱しています。私の予想される出力は、server0 - server4 がすべて文字列値を保持することです。なぜこれが起こっているのか、何か考えはありますか?

以下は、プログラムの簡略化されたバージョンです。

readingreg[0] = 4A;
readingreg[1] = AA;
readingreg[2] = AA;
readingreg[3] = A0;
char server0[1];
char server1[1];
char server2[1];
char server3[1];

完全なプログラムは 1000 行を超えるコードなので、コンパイルして実行するには、私が提供したもので十分なはずです。

4

1 に答える 1

1

あなたがするとき:

char server0[1];
sprintf(server0, "0x%02X", readingreg[0]);

5 文字 (末尾の '\0' を忘れないでください) を 1 文字のバッファーに入れようとしています。これにより、未定義の動作が発生し、観測された出力に表示されます。

あなたが(少なくとも)すべきことは、あなたが入れているものをすべて格納するのに十分な大きさの文字バッファを作ることです:

char server0[8];
sprintf(server0, "0x%02X", readingreg[0]);

より良い解決策は、配列を大きくし、または同様の関数を使用snprintf()して、文字バッファーがオーバーフローしないようにすることです。

char server0[8];
snprintf (server0, sizeof(server0)/sizeof(server0[0]), "0x%02X", readingreg[0]);
于 2014-09-03T21:13:55.033 に答える