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バイト文字が
全て文字化けして表示されてしまいました。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

WinXPSP2


VC++6.0では正しく表示されます。
VC++2008では、
_cwprintf(L"日本語 English");
としないとダメみたいです。
    • good
    • 1
この回答へのお礼

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

お礼日時:2009/05/26 20:33

えー、まず、


http://msdn.microsoft.com/ja-jp/library/ms235371 …
cprintf()は使うなと書いてあります。

あとはデフォルトではプロジェクトの文字コードがUnicodeになってるはずなので_cprintf()ではなくて_cwprintf()を使わないと駄目な気がします。

プロジェクトの文字コードをマルチバイトに変更すれば、おそらく_cprintf()でいけるのではないかと。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/26 20:26

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLISPのマクロと他の言語のマクロの違い

LISPのマクロは強力と言われていますが、他の言語の言うマクロとはどう違うのでしょうか?

Aベストアンサー

ここでいう「マクロ」は一言で言うと「プログラムを生成する機能」ですね。
例えばCのマクロを例に上げますと、
#define MAX(a, b) (a) > (b) ? (a) : (b)
というようなマクロを定義すると、後に
MAX(10, x)
と書いた際に
(10) > (x) ? (10) : (x)
というプログラムがコンパイル時に生成されます。

Cなどのマクロは、マクロ専用の文法があり、
マクロで書けるものにはある程度の制限が付きます。例えば、
「マクロの引数が定数の際に奇数か偶数かで『生成するプログラム』を変える」
などといった複雑なことはできません。

一方、Lispのマクロは、Lispそのもので書くことが可能で、
任意のプログラムをマクロとして書くことができます。
マクロの中で条件分岐やループなど、なんでも出来てしまいます。
これにより、コンパイル時にマクロの引数の型や値に応じて
生成するプログラムを変えることで最適化を行ったり、
新たな言語機能(と対応する文法)を追加するようなことが可能です。

例えば、昔のLispにはオブジェクト指向の機能がありませんでしたが、
マクロを使うことで、後からオブジェクト指向の機能を付け加えることができました。
また、Common Lispのオブジェクト指向の機能が独特で嫌いな人は、
マクロを使うことでJava風のオブジェクト指向の機能を追加するようなことも可能です。
極端な話、Lispの上で別の言語が作れてしまうわけです。

コンパイル時に任意のプログラムを実行できるという点では、
C++のテンプレートとも似ているといえますが、
C++のテンプレートはテンプレート専用の文法を用いる必要ある点がLispと異なります。
C++をそれなりに書ける人でも、テンプレートで任意のプログラムを書こうとすると、
かなりの苦労を強いられます。テンプレートの文法がC++の文法と異なるのが苦労する原因の一つです。
一方、Lispのマクロは、Lisp自身で書けるため、
Lispが書ける人なら誰にだって書けてしまうわけです。

以上がLispのマクロが強力と言われる要因(の一部)です。
実際に使われてみると色々と実感できると思いますよ。

ここでいう「マクロ」は一言で言うと「プログラムを生成する機能」ですね。
例えばCのマクロを例に上げますと、
#define MAX(a, b) (a) > (b) ? (a) : (b)
というようなマクロを定義すると、後に
MAX(10, x)
と書いた際に
(10) > (x) ? (10) : (x)
というプログラムがコンパイル時に生成されます。

Cなどのマクロは、マクロ専用の文法があり、
マクロで書けるものにはある程度の制限が付きます。例えば、
「マクロの引数が定数の際に奇数か偶数かで『生成するプログラム』を変える」
などといった複雑なことはで...続きを読む

Qbccコンパイラ実行エラー? 環境エラー?

Cのファイルをコンパイルをかけると
Fatal: ファイル C・C.OBJが開けません。
というエラーがでてしまいます。
これはどういったエラーなのでしょうか?
実行環境の設定エラー?
コードのエラー?
分からないんで分かる方よろしくお願いします。
bcc55はディレクトリC:じゃなく、D:にインストールしてあります。実行環境の設定も本に書いてあるとおりしてありますが、なかなか上手にいきません。
cfgファイル、batファイルの設定です。
この2つのファイルのエラーかどうかもわかりません。
よろしくお願いします。

Aベストアンサー

path %PATH%;d:\Borland\Bcc55\bin

この部分は実行ファイのあるディレクトリ(フォルダ)を指定しておくものです。
パス(PATH)を通すといいます。こうすることで、bcc55\bin以外のフォルダで
作業していてもコンパイラなどのコマンドを実行できるようになります。

c:
cd \borland\bcc55\Bin
command

はじめの2行は、作業フォルダを、c:\borland\bcc55\Bin に移動するものですが、
普通は、ソースコードを置くところを作業フォルダにするので、カットした方が
いいと思います。最後の1行は、Windowsから直接このBATファイルを起動したときに
作業ができるようにするためです。これがない場合は、すぐにWindowsに
戻ってしまうので作業ができません。そのため、一度、MS-DOS(コマンド)
プロンプトを起動してから、手でバッチファイルを起動しなければなりません。
そういう意味では、これは付けておいて、BATファイルを作業フォルダに入れて
それをWindowsからダブルクリックして実行するのが簡単ですね。

整理すると、bcc55.bat は次のようにするのが一番いいようです。
path %PATH%;d:\Borland\Bcc55\bin
command

尚、bcc55.bat はソースを置く作業フォルダに入れてください。
それを、ダブルクリックすれば作業可能になります。
(ソースの編集はメモ帳などWindows上のエディタを使えばOKです)
但し、WindowsNT/2000/Xpの場合は、「comannd」 の代わりに
「cmd」としてください。

path %PATH%;d:\Borland\Bcc55\bin

この部分は実行ファイのあるディレクトリ(フォルダ)を指定しておくものです。
パス(PATH)を通すといいます。こうすることで、bcc55\bin以外のフォルダで
作業していてもコンパイラなどのコマンドを実行できるようになります。

c:
cd \borland\bcc55\Bin
command

はじめの2行は、作業フォルダを、c:\borland\bcc55\Bin に移動するものですが、
普通は、ソースコードを置くところを作業フォルダにするので、カットした方が
いいと思います。最後の1行は、Wi...続きを読む

Qlispとその他関数型言語について

「lispを学べば悟りが開ける」という言葉をよく聞きます。

l他のプログラミング言語哲学とは一線を画すほどの教示をもった言語という印象を持ちます。

僕もlispを少し学んだだけですが「悟り」は開けませんでした。

しかし他の関数型言語(haskellとか)ではそういう話は聞きません。

なぜでしょうか。

やっぱ括弧ですか。

Aベストアンサー

他の言語が、まだまだ歴史が浅く、使っている人、特にカリスマと呼べるような人が少ないからではないでしょうか。
それに「haskellを学べば..」などといまさら言っても、二番煎じになってしまいますし。

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

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

Aベストアンサー

#2です。
文字コードがJISですので、これをEUCに変換すれば、あなたの望んだ結果が得られます。
コマンドライン上で
nkf -e  ソースファイル1 > ソースファイル2 と入力してください。
ソースファイル1は、あなたが作成したソースファイルです。これはJISコードになっています。ソースファイル2がEUCコードに変換されたファイルです。ソースファイル2をコンパイルすると、正しい結果が得られます。
尚、emacsの左下のところにエディット中のファイルの漢字コードが表示されるはずです。ソースファイル1の場合はEEJ、ソースファイル2の場合は、EEEと表示されるはずです。

QLISPで C言語のフォーマット書式の"%02d"

LISPで C言語のフォーマット書式の"%02d"にあたる記述の仕方がわかりません。どのようにすればよいのでしょうか?

Aベストアンサー

Common Lisp で良いのですよね?

(dolist (num '(5 10 200))
(princ (format nil "~2,'0D~%" num)))

実行結果:
05
10
200


format関数
http://www.yuasa.kuis.kyoto-u.ac.jp/~hiraisi/format-func.html

Qprintf関数の引数は文字例と決まっているからです。

printf関数は文字列しか引数として受け取りません。
printf("文字列");
では数値を引数にしたらどうでしょう?
#include <stdio.h>
#main () {
    printf(1);
    return 0;
}
これはコンパイルエラーになります。printf関数の引数は文字列と決まっているからです。

この文章について質問です。
Q.なぜ上の「文字数」はダブルクォーテーションで囲まれているのに、下の「1」にダブルクォーテーションはないのでしょうか?
Q.文書を見る限り、Cでは文字列と数値は区別されているように見えますが、なぜでしょうか?

Aベストアンサー

C言語に限らずほとんどの言語では文字と数字は区別されます。
"1" これは文字の1
1  これは数字の1

文字列と文字列を計算したらどうなりますか?
AB * CD
エラーですよね?
"12" * "34"
これもエラーです。文字列同士の掛け算ですから。
12 * 34
これならOKです。数字同士の掛け算はできますよね。

printf関数は文字列を表示する関数です。文字列です。数字ではダメなんです。
文字列はダブルクォーテーションで囲んでやる必要があるので、
printf("aaa"); ← OK
printf("123"); ← OK
printf(123); ← NG
となります。

Qlispの入門書

lispの入門書を探しています。

lispの書き方をただ説明するだけでなく、他の言語と違ってどういう利点が
あるのかを説明したものがいいです。

なにかおすすめの本があったら教えてください。

Aベストアンサー

・The Little Schemer
Lispの最高の入門書です。一問一答を追っていくことで、リスト操作やLispプログラムを作っていく感覚について皮膚で理解できるようになります。
英語ですが、難しい文章はないのでそれほど問題ないはず。
環境の整えかたなどの記述はいっさいありません。 "Lisp" を実践して学ぶ本です。

・プログラミングGauche
Lispの方言の一つにSchemeという言語があります。その一つの処理系であるGaucheの本です。さいきん出たばっかり。
Gauche のさまざまな組み込み関数を利用することで関数型プログラミングを実践していきます。
日本語で勉強したいならこちらです。

・リスト遊び
日本語だとこの辺も入門書です。あまり詳しく知りませんが、Emacs Lispの本です。
筆者はEmacs上でemailを読めるMewというソフトウェアの開発者でもあるそうです。

Lispの良さについてはネット上の文章を読む方がよろしいかと。適当に、LispとかPaul GrahamとかShiroとかのキーワードを探してみてください。
「ハッカーと画家」を読むのも良いですね。


Lispコミュニティにコミットするのがいちばんですが。

・The Little Schemer
Lispの最高の入門書です。一問一答を追っていくことで、リスト操作やLispプログラムを作っていく感覚について皮膚で理解できるようになります。
英語ですが、難しい文章はないのでそれほど問題ないはず。
環境の整えかたなどの記述はいっさいありません。 "Lisp" を実践して学ぶ本です。

・プログラミングGauche
Lispの方言の一つにSchemeという言語があります。その一つの処理系であるGaucheの本です。さいきん出たばっかり。
Gauche のさまざまな組み込み関数を利用することで関数...続きを読む

Qprintf("%d",func())はなぜ実行できないのか?

main(){
int i;
i = func();
printf("%d",i);
}

int func(){
return 1;
}

はちゃんと1が表示されるのになぜ、

main(){
printf("%d",func());
}

int func(){
return 1;
}

は1が表示されず変な値になってしまうんでしょうか?
funcのアドレスが表示されているんでしょうか?

よろしくお願い致します。

Aベストアンサー

使っているコンパイラですが、VC++でしょうか?
-85は16進でいうところのABです。(←恐らくこれはコンパイラがデバッグ用に埋め込んだ数値だと思います。リリースコンパイルでは落ちるか不定だと思います。)

main関数とfunc関数ですが別ソース、或いは別プロジェクトではないですか?
関数を呼ぶ場合、stdcallとcdeclというものがありますが、これが一致しないとスタックが壊れます。
もしVC++であれば試しに以下のコードでうまく動かないか試してください。

int _cdecl func();

int main()
{
printf("%d\n",func());
return 0;
}

int _cdecl func()
{
return 1;
}

Q初めて関数型言語を学ぶとしたら、どの言語がお奨めですか?

初めて関数型言語を学ぶとしたら、どの言語がお奨めですか?
JavaScriptをやっていて、関数型言語に興味を持ちました。

いままで、勉強した言語はC < Java < Python < JavaScriptです。(右側の方が比重・興味が大きい)
現在、Web系志望の学生なので、その辺を踏まえてアドバイスいただけると助かります。

今のところ興味を持ってるのは、Common Lisp/Haskellあたりです。

よろしくお願いします。

Aベストアンサー

C言語が「関数型」?なのか、と言われると多分違うと思うんですけどね。普通は命令型/手続き型に分類されるんじゃないか、と思います。

ちなみに、JavaScriptはSchemeに影響を受けてる言語です。それで言うと、SchemeかCommon Lispがいいんじゃないのかな、とは思いますがね。ただ、あんまり関数型、って感じで書かれている本は少ないと思います。

Web系志望と言う事なんで、Common Lispですと、

ANSI Common Lisp: http://www.pej-hed.jp/washo/288.html
にHTML生成のトピックあり。

実践Comon Lisp: http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06721-1
にAllegro Serveと言うライブラリを利用したWebプログラミングの例があり。HTML生成の例もあり。
原著のサイトでは、
http://www.gigamonkeys.com/book/practical-web-programming-with-allegroserve.html
http://www.gigamonkeys.com/book/practical-an-html-generation-library-the-interpreter.html
http://www.gigamonkeys.com/book/practical-an-html-generation-library-the-compiler.html
辺り。

プログラミング言語Lisp: http://ascii.asciimw.jp/books/books/detail/4-7561-3926-4.shtml
CL-HTTPと言うライブラリを用いたWebサーバーの説明が載っています。
ただし、本自体はMacintosh用の商用実装、Mac Common Lisp

Mac Common Lisp:
http://www.digitool.com/

を用いたものなんで、注意する必要があります。Macを持ってないならあまりお薦めしません。また、若干古い本ですね。

Haskellの方は良く分かりませんが、Common LispならそれなりにWeb関係の簡単なアプリの書き方も紹介されている、と言う事です。

参考までに。

C言語が「関数型」?なのか、と言われると多分違うと思うんですけどね。普通は命令型/手続き型に分類されるんじゃないか、と思います。

ちなみに、JavaScriptはSchemeに影響を受けてる言語です。それで言うと、SchemeかCommon Lispがいいんじゃないのかな、とは思いますがね。ただ、あんまり関数型、って感じで書かれている本は少ないと思います。

Web系志望と言う事なんで、Common Lispですと、

ANSI Common Lisp: http://www.pej-hed.jp/washo/288.html
にHTML生成のトピックあり。

実践Comon Lisp: http://s...続きを読む

QMacOSX で getche() と同じ能力をもった関数

初めましてC言語をMacOSXで勉強しております。独習Cというテキストを参考にしておりますが、conio.h ヘッダの getche() 関数を多用しております。OSXではこの関数を使う事ができませんが、それと同等な関数は用意されているのでしょうか。基本的な事で恐縮ですが、どうぞよろしくお願いいたします。
また、OSXでC言語を学習する上で他のコンパイラなどとの相違、注意が必要な部分などございましたらどうぞご教授ください。

Aベストアンサー

conio.hは、Winodws系でのみ提供されているライブラリ関数ですので、Mac OS X(gcc)では提供されてません。
stdioかncursesとかで同じ関数を自作するか、書き換える必要があります。

Mac OS Xの特異なところは、
・Mach
・Objective-C
・Cocoa/Carbon
――などありますが、C言語処理系としてgccを採用してますから、Cの初級レベルでは、とくに他と変わるところはありません。

参考URL:http://www.wence.vandermeersch.org/gconio/


人気Q&Aランキング