- ベストアンサー
char AA[]{"全角文字"};から"全"という一字を取り出したい
今晩は、Cの初心者です、宜しくお願いします。 全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。 どのようにしたら取り出せるのでしょう。 ポインタを使う方法と使わない方法を教えて下さい。 宜しくお願いします。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
お疲れ様です。 まずお伺いしたのがOSおよび開発するためのコンパイラです。 ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。 (マルチバイト文字セットと言います。) 詳細は参考URLを参照の事。 windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。 結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出す必要があります。 >char AA[]={'全','角'}; を char AA[]="全角"; とし >printf("%s%s\n" , AA[0],AA[1] ) ; を printf("%c%c\n" , AA[0],AA[1] ) ; とすれば、「全」だけを表示する事が可能と思われます。 日本語を文字列で表示する為の文字コードについては Shift-JISだけでなく、UnicodeやUTF・EUC・JISなどがあります。 もう少し詳しく記載してあるホームページはないか探してみましたが、ちょっと無理でした。
その他の回答 (8)
- jacta
- ベストアンサー率26% (845/3158)
回答と全然違うことをやって、できないと言われてもどうしようもないのですが... > ある特定の要素を指定して、一文字だけをどうやったら取り出せるのでしょうか。 それを実現するには、'全', '角', '文', '字'の各文字がchar型の表現範囲に収まるような処理系を使ってくださいとしかいえません。 そうした適当な処理系がないなら、自分で処理系を実装してください。
処理系に依存するかもしれませんが。 Visual Studio 2005で確認しました。 #include <stdio.h> #include <locale.h> int main(void) { wchar_t *locale = NULL; //文字セット格納用 wchar_t *string = L"全角文字"; wchar_t data; locale = _wsetlocale(LC_CTYPE, L""); //システムの文字セットを取得 _wsetlocale(LC_ALL, locale); //対応後をセット data = string[0]; wprintf_s(L"%c\n", data); return (0); }
- jacta
- ベストアンサー率26% (845/3158)
#1で挙げた方法であれば、処理系に依存せずに実現できますが、そうでなければどうしても処理系に依存します。 いまさらながら処理系を補足してください。 ちなみに、char型は8ビットかどうか、符号付きかどうかは処理系定義です。また、'全', '角', '文', '字'の各文字がchar型の表現範囲に収まるかどうかも処理系に依存します。仮にchar型が8ビットだとしても。
- php504
- ベストアンサー率42% (926/2160)
char AA[]={'全','角'}; '全'はint型でcharの取り得る範囲(-128~127)を超えているのでこの初期化ではあなたの意図している値は代入されないでしょう
- jacta
- ベストアンサー率26% (845/3158)
> XX={全角文字}として、"全"とポインタを使って取り出すのはどのようにすればよいのでしょうか。 意味が分かりませんが、printfで出力したいのであれば... char AA[] = "全角"; int n = mblen(AA, MB_CUR_MAX); printf("%.*s%s\n", n, AA, AA + n); とすればよいかと思います。 あるいは、(厳密には処理系に依存しますが...) wchar_t AA[] = L"全角"; printf("%lc%lc\n", AA[0], AA[1]); としてもよいでしょう。 もとの文字列がどうしてもcharの配列でなければならないなら、この方法は使えません。
お礼
actaさん、回答有り難うございます。 下のようなコードですが、エラ-です、「zenkaku[0])」を「zenkaku」 としても同じです。 ある特定の要素を指定して、一文字だけをどうやったら取り出せるのでしょうか。 ========================================================== int main(void) { char *zenkaku = "全角文字" ; printf("%s\n" , zenkaku[0]); return 0; }
- asuncion
- ベストアンサー率33% (2127/6289)
>char AA[]{"全角文字"}; 最初にAA[]の中身をこうしたい(文法は少し違ってますが)と書かれているのに、 >char AA[]={'全','角'}; どうして、このように書かれるのですか? さらに、 >printf("%s%s\n" , AA[0],AA[1] ) ; >printf("%s%s" , AA[2],AA[3] ) ; AA[0]~[3]は、すべて全角文字の片割れでありまして、1バイトです。 これらを出力する制御文字として"%s"は本当に正しいですか?
- asuncion
- ベストアンサー率33% (2127/6289)
>全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。 どういったコードを書かれて、何をしたときにどんなエラーが出るのでしょうか。 単に「エラーが出る」だけでは、いかんともしがたいです。 AA[0]とAA[1]の2バイトを出力するコードを書いたとき、どうなりますか?
お礼
asuncionさん、回答有り難う御座います。 下のようなコードを書いてやりました。 "エラーがあります"と表示されて "multiple makers at this line -format argument is not a pointer" の警告です。 宜しくお願いします。 ============================================================= #include <stdio.h> int main(void) { char AA[]={'全','角'}; printf("%s%s\n" , AA[0],AA[1] ) ; printf("%s%s" , AA[2],AA[3] ) ; return 0 ; }
- jacta
- ベストアンサー率26% (845/3158)
ロケールを適切に設定した上で... int n = mblen(AA, MB_CUR_MAX); char mbc[MB_CUR_MAX]; memcpy(mbc, AA, n); とすれば取り出せるかと思います。 ポインタを使わずに実現することは多分無理です。
お礼
jactaさん、回答有り難う御座います。 XX={全角文字}として、"全"とポインタを使って取り出すのはどのようにすればよいのでしょうか。
お礼
皆さん、色々と貴重な回答有り難うございます。