C言語で2バイトのバイナリデータ、例えば0x82a0があるとしてこれが「あ」に対応するのですが、
%sや%cの変換指定子ではこのデータを渡しても「あ」にならないのですがどうすればいいでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ベストアンサー
「あ」を出力するパターンをいくつか考えてみました。
c
1#include <stdio.h> 2int main(void){ 3 4 // 通常の定義 5 char a1[] = "あ"; 6 printf("%s\n", a1); // 文字列で出力 7 8 // コードで指定。配列の中身はa1のパターンと同じ。 9 char a2[3] = { 0x82, 0xa0, 0x00 }; 10 printf("%s\n", a2); // 文字列で出力 11 12 // 上記を文字で出力 13 printf("%c%c\n", a2[0], a2[1]); 14 15 // 質問のパターンは文法的にアウト 16 // %sにはアドレスを渡す必要がある。これは値。 17 //printf("%s\n", 0x82a0); 18 19 // %sにはアドレスを渡す必要があるので変数に格納してから出力。 20 // しかしリトルエンディアン環境ではメモリ上では上位バイトと下位バイトが入れ替わっているので化ける 21 // 0xa082を出力しているのと同じこと 22 int a3 = 0x82a0; 23 printf("%.2s\n", (char*)&a3); // %sの場合NULL終端である必要があるので文字数を2文字に限定 24 25 // 上位バイトと下位バイトを取り出して文字で出力すればOK 26 printf("%c%c\n", a3 / 0x100, a3 % 0x100); 27 28 // 文字列として出力するなら一旦変数に入れなおす 29 char a4[3]; 30 a4[0] = a3 / 0x100; 31 a4[1] = a3 % 0x100; 32 a4[2] = 0x00; 33 printf("%s\n", a4); 34} 35 36
投稿2018/08/23 00:24
編集2018/08/23 00:27総合スコア16998
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/23 02:59
0
c
1#include <stdio.h> 2#include <stdint.h> 3int main(){ 4 int a = 0x82a0; 5 printf("%c%c\n", (a>>8) & 0xff, a & 0xff); 6 7 int c = 1; 8 if(*(char*)&c) // エンディアンの確認 9 { 10 // ホストはリトルエンディアン 11 int32_t b = 0xa082; 12 printf("%s", (char*)&b); 13 } 14 else 15 { 16 // ホストはビッグエンディアン 17 int32_t b = 0x82a00000; 18 printf("%s", (char*)&b); 19 } 20}
投稿2018/08/23 05:02
総合スコア15147
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
1バイトずつ%c
で出力します。
C
1int a; 2 3a = 0x82a0; 4printf("[%c%c]\n", a>>8, a&0xFF);
ワイド文字処理機能というのもありますが、よく知りません。
リトルエンディアン前提だと、こういうこともできますね。
C
1printf("[%c%c]\n", ((char*)&a)[1], ((char*)&a)[0]);
投稿2018/08/23 00:21
編集2018/08/23 00:31総合スコア84559
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
これでいけると思います。
c
1/* char.c */ 2 3#include <stdio.h> 4#include <string.h> 5 6int main(void){ 7 char msg[]={0x82,0xa0,0x00}; 8 printf("%s\n", msg); 9}
私の環境のモジコードがUTF-8で0x82 0xa0 の文字コードがわからなかったので、nkfを間にいれました。
gcc char.c -o char && ./char | nkf -u
投稿2018/08/22 14:49
総合スコア1088
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
%sや%cの変換指定子では
とありますが、具体的には、どう記述していますか?
%c については、1文字(1 byte)指定なので、なんとなく予想できますが、 %s については、数字(int)をそのまま、指定したのでしょうか?
手元で、
C
1 char str[10] = "\x82\xa0\n"; 2 printf("%c%c%c", str[0], str[1], str[2]); 3 printf("%s", str); 4
とし、VC++ 2017 でコンパイルしたら、問題なく、"あ" が2行出力されました。
(Windowsの コマンドプロンプトで実行)
指定の仕方じゃないかと思います。
投稿2018/08/22 14:44
編集2018/08/22 14:52総合スコア6383
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/22 15:01
2018/08/23 11:13
2018/08/23 12:29
2018/08/23 12:54
0
こんな漢字で、
c
1#include<stdio.h> 2 3int main(void) 4{ 5 char s[10]; 6 int x = 0x82a0; 7 8 s[0] = x / 256; 9 s[1] = x % 256; 10 s[2] = '\0'; 11 printf("%s\n", s); 12}
投稿2018/08/22 14:40
総合スコア5737
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。