1. ホーム
  2. c

[解決済み] C 言語の符号なし文字列の配列

2022-02-14 20:09:35

質問事項

次のような文字列の配列があります。

char *T[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};

しかし、このようにすると、各文字列は符号なし文字列の配列になります。

unsigned char *T[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};

エラー "Initializing 'unsigned char *' with an expression of type 'char[5]' converts between pointers to integer types with different sign." つまり、使われている "0" と "1" の表現の一部が符号付きであると推測されますが、なぜ/どう対処したらいいのかがわかりません。 私は、各文字列が符号付き文字ではなく符号なし文字の配列であるような文字列の配列を持ちたいと思っています。 どなたかお手伝いいただけないでしょうか?

注:これはHWの問題に対するものですが、実際の問題ではなく、数多くある可能な解決策の中の小さな一歩に過ぎません。 しかし、明確な答えを出さなくても、理解の助けになれば良いと思います。 ありがとうございます。

どのように解決するのですか?

C言語の文字列は、文字列を表現する多くの方法のうちの1つで、以下の配列で構成されています。 char は、末尾の char を持ち、その null の値を指定します。 コード中に "0000" がある場合、型的にはそのようになります。

の配列として代入することです。 unsigned char を末尾に持つ unsigned char であり、NULL値を持つ。 このような場合、キャストを行うか、あるいはキャストを必要としない方法で初期データを表現する必要があります。

unsigned char T[][] = { { 0x30, 0x30, 0x30, 0x30, 0x00 }, 
               { 0x30, 0x30, 0x30, 0x31, 0x00 }, 
               { 0x30, 0x30, 0x31, 0x30, 0x00 }, 
               { 0x30, 0x30, 0x31, 0x31, 0x00 }, 
               { 0x30, 0x31, 0x30, 0x30, 0x00 }, 
               { 0x30, 0x31, 0x30, 0x31, 0x00 }, 
               { 0x30, 0x31, 0x31, 0x30, 0x00 }, 
               { 0x30, 0x31, 0x31, 0x31, 0x00 }, 
               { 0x31, 0x30, 0x30, 0x30, 0x00 }, 
               { 0x31, 0x30, 0x30, 0x31, 0x00 }, 
               { 0x31, 0x30, 0x31, 0x30, 0x00 }, 
               { 0x31, 0x30, 0x31, 0x31, 0x00 }, 
               { 0x31, 0x31, 0x30, 0x30, 0x00 }, 
               { 0x31, 0x31, 0x30, 0x31, 0x00 }, 
               { 0x31, 0x31, 0x31, 0x30, 0x00 }, 
               { 0x31, 0x31, 0x31, 0x31, 0x00 }
              };

この方法の主な問題点は、そもそもC言語スタイルの文字列を持つことの利点のほとんどが失われてしまうことです。 unsigned char "string"では、標準の文字列ライブラリを自由に使うことができないので、もし printf などの文字列指向の関数があります。

本当に、各文字の可能な位置に対して2つの値しか使っていません。 文字列で実行しなければならないやむを得ない理由がない限り、ブール値の配列を検討し、"0hello"のような文字列がコードに入り込む可能性を減らすか、または、次のような方法で実行します。 それよりも ビットフィールドを学んだことがある人は、符号なし文字列の中のビットをビットフィールドとして使ってください(文字列を扱っているという概念は捨ててください)。

最後の手法の利点は、使用するメモリが少ないことと、値が0か1以外にならないことです。しかし、パックされたビットを人間が読めるものに変換するために、小さなルーチンのコレクションを書かなければならないでしょう。

unsigned char[] = { 0x00, 0x01, 0x02, 0x03, 0x04,
                    0x05, 0x06, 0x07, 0x08, 0x09,
                    0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
                    0x0F };

void displayChar(unsigned char value) {
  switch (value) {
    case 0x00: printf("0000"); break;
    case 0x01: printf("0001"); break;
    case 0x02: printf("0010"); break;
    case 0x03: printf("0011"); break;
... and so on ...