【3月6日実施】システムメンテナンス実施のお知らせ

char moji5[] = "文字列テスト";
printf("moji5[0] = %c\n", moji5[0]);
printf("moji5[1] = %c\n", moji5[1]);
printf("moji5[2] = %c\n", moji5[2]);

などとやってみても、当然1バイトずつしか出力されないので、ヘンな結果になります。
上記の例で、「文」「字」「列」などと日本語で1文字ずつ出力させるには、どうすればよいのでしょうか?

質問者からの補足コメント

  • 環境は、windowsパソコンでVisual Studioの無料版を使っていますが、なるべくどこでも共通に使える方法をお願いします。

      補足日時:2023/05/09 15:10

A 回答 (4件)

単純に考えるなら


wchar_t と wprintf を使いましょう
参考)
https://learn.microsoft.com/ja-jp/cpp/c-runtime- …

ただし、絵文字とか、肌色付き顔文字とか、国旗文字とか
最近になって追加された文字は単純な代物ではなくなってきたので、
素直に専用ライブラリを活用することをお勧めします。
参考)
https://learn.microsoft.com/ja-jp/windows/win32/ …
https://unicode-org.github.io/icu-docs/apidoc/re …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。以外と面倒なんですね。

お礼日時:2023/05/10 20:09

C言語の範囲でいえば wchar_t を使うしかないはず. 出力は wprintf だったり putwchar だったり.



とはいえこれらの機能は locale 依存で「プログラム内の文字コード」と「表示するための文字コード」とが合致しているという保証がないので, 真に「どこでも共通に使える」方法ではない... というか, ぶっちゃてけいえばそんな方法は存在しない.

なお Unicode は最初からややこしかったはず. 例えばウムラウト付きの文字を「ウムラウト付きの 1文字」としても「ウムラウトなしの文字+ウムラウト」としても表現できるので, 本気でなにかしようとしたら外部ライブラリはおそらく必須. あんなのまじめに対応する気にはなれない.
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。思ったよりも面倒なことがよくわかりました。

お礼日時:2023/05/10 20:10

文字コードがSiftJISかUTF-8かでバイト数が変わりますので、かなりややこしくなります。


普通はmblen()で対象の文字のバイト数をチェックするんですが、mblen()が装備されていなければ、自作するしかありません。
割とメジャーな関数ですから、誰かが作って公開していると思いますので、探したら見つかると思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
mblen()を試してみました。これだと何とか1文字ずつ書き出せそうです。バイト数が混在している文字列でも使えるのがいいですね。

お礼日時:2023/05/09 16:30

char moji2[] = {moji[0], moji[1]};


printf("moji2= %s", moji2)
こんな感じに2つをセットで配列に入れてprintすると出力できると思います。

余談ですが、
プログラミングの練習でしたらc#をオススメはします。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。
教えて頂いたやり方で、最後にヌル文字を付けるとうまく行きました。

お礼日時:2023/05/09 16:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A