• ベストアンサー

cprintf()関数で2バイト文字を表示するには

cprintf()関数の引数に2バイト文字を含む文字列を指定してプログラムを 実行すると、表示結果の2バイト文字の部分が全て文字化けしてしまいます。 cprintf()関数で2バイト文字を表示することはできないのでしょうか? ご教示宜しくお願い致します。 下記は実際に文字化けしてしまうコードです。 ---------------------- #include <conio.h> int main(void) { cprintf("日本語 English"); return 0; } ---------------------- 【環境情報】 使用コンパイラ:VC++2008 実行環境:WinXPSP2とVistaHomePremiumSP1の2環境で確認 【質問の背景】 『独習C 第3版』という本の中に、一部のコンパイラでは、getche()の ような非標準の入出力関数とprintf()などの標準の入出力関数を併用 すると問題が発生すると記載されており、printf()関数の代わりに cprintf()関数を使用したサンプルコード(上記のコードとは異なる)も記載されています。 しかし、実際にそれをコンパイルして実行してみると、2バイト文字が 全て文字化けして表示されてしまいました。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

WinXPSP2 VC++6.0では正しく表示されます。 VC++2008では、 _cwprintf(L"日本語 English"); としないとダメみたいです。

HighDef
質問者

お礼

ご回答ありがとうございます。 VC++6.0ではうまく動くのですね。 『独習C 第3版』の第1刷発行日は2002年9月18日となっているので、 その時点では問題ないコードだったんだとおかげで納得できました。

その他の回答 (1)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

えー、まず、 http://msdn.microsoft.com/ja-jp/library/ms235371.aspx cprintf()は使うなと書いてあります。 あとはデフォルトではプロジェクトの文字コードがUnicodeになってるはずなので_cprintf()ではなくて_cwprintf()を使わないと駄目な気がします。 プロジェクトの文字コードをマルチバイトに変更すれば、おそらく_cprintf()でいけるのではないかと。

HighDef
質問者

お礼

ご回答ありがとうございます。 setlocale()関数を使ったところうまくいきました。 ----------------------------- #include <conio.h> #include <locale.h> int main(void) { setlocale(LC_CTYPE, "jpn"); _cprintf("日本語 English"); return 0; } -----------------------------

関連するQ&A

  • 2バイト文字が文字化けする!

    次の条件でデータが送られてくるのですが、エディタで開くと2バイトのところだけ文字化けします。 きちんと2バイト文字を表示させたいのですが、なにか方法はありますでしょうか? 教えてくださいますよう、宜しくお願いします。 【使用コード】 ・1バイト文字:JIS X0201(1976)に準拠するJIS8コードセット ・2バイト文字:新JIS(JISC6226-1983)に準拠するコード 使用OS:Windows2000Pro 使用エディタ:EmEditor v3

  • 3バイト文字(UTF-8)をprintfで等幅表示をするには?

    64BIT環境のLINUX、gcc で開発をしております。 表題の件ですが、UTF-8 は3バイト文字が多いため、strlenの戻り値と、printf で表示したときの画面上の桁数が一致しません。 そのため、下記のようなプログラムを実行すると >> int main() { char* s = "あいうえお"; printf("%20s\n", s); return 0; } ... あいうえお << と、画面上で15桁で表示されます。 つまり、文字列中のUTF-8の文字数分、表示幅がフィールド幅より短くなるわけです。 現状、文字列中の UTF-8文字の数を数える関数を作成し、以下のように対処しております。 >> int strUTF8Count(const char* s) { int notAsciiCount = 0; while(*s++) { if (!isascii(*s)) ++notAsciiCount; } return notAsciiCount / 3; } int main() { char* s = "あいうえお"; printf("%*s\n", 20 + strUTF8Count(s), s); return 0; } << これで、現状動いておりますが、strUTF8Count関数の作りが雑で、ascii でなければ UTF-8 と仮定しているし、UTF-8 であれば、3バイト文字と仮定してしまっています。 printf もかなりみづらいですし、何かもっとスマートな方法はないものでしょうか? UTF-8 の扱いとしては一般的なものと思われますが、ネット上を検索しても有効な対処が見つかりませんでした。 どなたかよい知恵をお持ちの方がいらっしゃいましたら、知恵を分けてくれるようお願いします。

  • 2バイト文字の記号について

    ■、○、▼などはどの言語環境でも表示されるのでしょうか? デザイン要素として□を使いたいのです。 NC の文字コードセットを切り替えてみても 特に文字化けを起こしたりしないのですが、 それは私が日本語環境だからなのですか?

  • printfで全角カタカナが文字化け?

    C言語において、printf関数をつかって全角カタカナを表示しようとすると、文字化けが発生します。 puts関数を使うと文字化けは発生しないので、使用上は特に問題は無いのですが、原因は何でしょうか?文字コードに起因するものでしょうか? ちなみに、OSはRedHatLinux9を使用しています。 宜しければ、回答お願い致します。

  • printf() だけで文字列を表示できる??

    1: int printf(char *, ...); 2: main() 3: { 4: printf("Hello, world.\n"); 5: } C で書かれた上のプログラムが正常にコンパイルでき、しかもHello, world. と表示することが理解できません。どなたか教えていただけないでしょうか。 1行目でprintf のプロトタイプ宣言を書き、その実体は書いていません。これをコンパイルしたとき、「printf() は知らない」と言われると思いましたが、そうはならず、Hello, world. を表示しました。 また、1行目の関数宣言の引数を変更すると、「ビルトイン関数と型が一致しない」と言われます。その「ビルトイン関数」というのは文字通りビルトインされていて任意に使用できるようになっているのでしょうか。 コンパイラはgcc version 3.4.4 です。

  • 2バイト文字vsASC関数

    輸入実務を担当しているものです。 日本国内の第三者から、エクセルファイルでアルファベットと数字のデータを貰います。それをまとめて、新規のエクセルファイルにし、アメリカへE-Mailに添付して 送る作業を予定しています。 ただし、第三者は、どんなやりかたでデータを作ってくるか判りません。 アメリカでの文字化けを避けるべく、ASC関数で、2バイトにして、(或いはしたつもりで)貰ったデータを使おうかと思っています。 質問は; 1)日本語バージョンのエクセルでも、アルファベット、数字になっていれば、それらは見たとおりなので、わざわざASC関数とかの処理は必要ないのか? 2)ASC関数で処理したアルファベット、数字は2バイト文字なので、アメリカのエクセルで開けた時、文字化けはおこらないか? 3)及び、この一環の作業において、他の参考意見をうかがえれば幸いです。

  • 改行させずに文字配列を出力させる関数

    改行させずに文字配列を出力させる関数は、printf以外にありますか? printf("Hello world!!"); //改行せずに出力 char str[]="Hello world!!"; puts(str); //改行されて出力 出力の最後に自動的に改行文字を追加しないで、文字配列を表示する標準関数って、printf以外にありますか? もしくは、改行されない関数が必要な場合は自作するしかありませんか?

  • C言語のprintf()関数の「f」の意味

    標準入出力関数のprintfの意味が分かりません。 「print」は印刷だと思いますが、「f」は何なのでしょうか? 詳しい方がいましたら、よろしくお願いします。

  • glob関数で日本語文字が取得できません。

    PHPでglob()関数を使って画像ファイル一覧を取得しようと試みたのですが、引数に"C:/Documents and Settings/xxxxxx/My Documents/My Pictures/風景/*.jpg" といった引数にすると日本語部分の文字が文字化けしているようで取得できません。 glob関数は2バイト文字は使えないのでしょうか? それともOSとの文字化けの関係なのでしょうか? 解決するにはどうしたらいいのでしょう? [実行環境] OS : Windows XP PHP version : 5.1.6 Server: Apache 2.2.3;

    • ベストアンサー
    • PHP
  • 文字化け

    C言語初心者です。 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { printf("表示"); system("PAUSE"); return 0; } と書いてコンパイルしたのですが「表示」のところが文字化けしてしまいます。 他にも文字化けするかもしれないので、 解決法を教えて下さい。 使っているコンパイラは、Bloodshed Dev-C++です。

専門家に質問してみよう