ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

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を学べば悟りが開ける」という言葉をよく聞きます。

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

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

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

なぜでしょうか。

やっぱ括弧ですか。

Aベストアンサー

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

QC言語の関数(if文やfor文を含む関数)の定義の仕方

C言語の関数(if文やfor文を含む関数)の定義の仕方

int WINAPI WinMain(HINSTANCE hI,HINSTANCE hP,LPSTR lpC,int nC){
●●
}
↑上記のような形式のウィンドウアプリケーションの場合、
関数の定義はint WINAPI~の前にしておくべきなのでしょうか?
関数の中にif文やfor文を入れようとすると「関数定義のようですが、パラメータ リストがありません。外見上の本体をスキップします。」というエラーが出てしまいます。

int WINAPIの中で定義しようとするとそれはそれで「ローカル関数の定義が正しくありません」というエラーが出てしまいます。
詳しい方がいたらアドバイス願います。

※関数を使わずにプログラムを組んだことはあるのですが、関数の定義に初挑戦しようとしたところ見事にわけが分からなくなってしまいました。

Aベストアンサー

>関数の中にif文やfor文を入れようとすると「関数定義のようですが、パラメータ リストがあ
>りません。外見上の本体をスキップします。」というエラーが出てしまいます。

>int WINAPIの中で定義しようとするとそれはそれで「ローカル関数の定義が正しくありませ
>ん」というエラーが出てしまいます。

これらのエラーが出たときのソースコードを見せてください。
ソースコードとエラーとを対応づけないと、原因や対処法がわかりません。


>※関数を使わずにプログラムを組んだことはある

それはないんじゃないでしょうか。CやC++のプログラムは関数の集まりです。
少なくとも、main関数やWinMain関数は使っているはずです。

Q子供の言語習得

どうして子供は大人より簡単に、そして早く言語を習得できるのですか。
また言語を習得するにおいて、子供に有利な点はなんですか。

Aベストアンサー

脳には発達段階で臨界期と呼ばれる時期があります。
それぞれの項目で一番伸びの良い時期です。

臨界期を逃すと、その項目の習得は困難になります。

言語の臨界期を逃すと、言語習得に苦労します。
英語か日本語かという問題でもなく、
言葉の概念を身に着ける時期のことです。

言語習得において子供が有利な点は
母国語による言語が完成していないので
母国語に近い形で第二ヶ国語も習得できる
可能性があると思いますが、
バイリンガルは思考が浅くなりがちな傾向を
聞いたことがあります。

母国語をしっかりみにつけてから
第二ヶ国語を習得するとまた思考が
変わってくるかもしれません。

言葉は文化に根付いたものが多いので
生活文化と言葉は一致していたほうが
自然だとは思いますが。

Q空白を含む文をファイルに書き込んで10文字ずつ読み出す

空白を含む文を10文字ずつ読み出そうとしています。でも

文1:I am a poor programmer.
文2:2nd Sentence
結果:2nd Sentenr programmer.

となります。"I am a poo"が欲しいのですが。
800文字以内にするためにmainだけにしました。後で補足できます。

int main()
{
sentence sntc;
fstream file;

file.open("SENTENCE.TXT", ios::app | ios::out | ios::in | ios::binary );

sntc.getData();
file.write( reinterpret_cast<char*>(&sntc), sizeof(sntc) );

file.seekg(0, ios::end);
int endposition = file.tellg();
int n = endposition / sizeof(sentence);
cout << "\nThere are " << n << " sentences in file";

cout << "\nEnter sentence number: ";
cin >> n;
int position = (n-1) * sizeof(sentence);
file.seekg(position);

file.read( reinterpret_cast<char*>(&sntc), sizeof(sntc) );
sntc.showData();
cout << endl;

file.seekg(position, ios::cur);
file.read( reinterpret_cast<char*>(&sntc), 10);
sntc.showData();
cout << endl;
return 0;
}

空白を含む文を10文字ずつ読み出そうとしています。でも

文1:I am a poor programmer.
文2:2nd Sentence
結果:2nd Sentenr programmer.

となります。"I am a poo"が欲しいのですが。
800文字以内にするためにmainだけにしました。後で補足できます。

int main()
{
sentence sntc;
fstream file;

file.open("SENTENCE.TXT", ios::app | ios::out | ios::in | ios::binary );

sntc.getData();
file.write( reinterpret_cast<char*>(&sntc), sizeof(sntc) );

file.s...続きを読む

Aベストアンサー

ひさしぶりにストラウストラップ本を見返してみました。
やはり、readでは\0が付加されないようです。
(『プログラミング言語C++第3版』§21.3.4)

seekgの前でちゃんと表示されたのは、ファイルからではなく、
getData()によって入力されたからでしょう。
この場合、自動的にヌルが付加されます。

ファイル読み込みに、read()ではなく、
getline()を使うと良いと思います。

ただ、やっぱりこのキャストはおかしい。
こうやって入力すると、たまたまsentence内のstrに
データが入るかもしれませんが、
オブジェクトの使い方としてはいただけません。

代案として、
(1)strをpublicにして、
file.getline(sntc.str, 11);
のようにする。

(2)バッファを使い、sentenceにsetStr, getStrメソッドを付加して、
char buf[80];
file.getline(buf, 11);
sntc.setStr(buf);
のようにする。

これ以上はわからないので、
C++に詳しい人の登場を待ちます。

ひさしぶりにストラウストラップ本を見返してみました。
やはり、readでは\0が付加されないようです。
(『プログラミング言語C++第3版』§21.3.4)

seekgの前でちゃんと表示されたのは、ファイルからではなく、
getData()によって入力されたからでしょう。
この場合、自動的にヌルが付加されます。

ファイル読み込みに、read()ではなく、
getline()を使うと良いと思います。

ただ、やっぱりこのキャストはおかしい。
こうやって入力すると、たまたまsentence内のstrに
データが入るかもしれませんが...続きを読む

Qプログラミング言語ってどうしてこんなに多いの?

会社に新入社員が実習で入ってきました。気さくな20歳の女の子ですが、C言語とかを使ってプログラムは組めるそうです。パソコン歴は長いのですが、BASIC言語で組んだ頃で終わりです。
なにかすっごく嫉妬を感じたのですが、どうしてこんなに言語が存在するのでしょうか?。言語の特性とできましたら、習熟の難易度などをかかれていただくと助かります。また、今もっとも注目を浴びている言語がありましたら、参考までにお願いします。

Aベストアンサー

 プログラミング言語が多い理由は、世界に人間がしゃべる言語が多いのとほぼ同じだ。それぞれ必要があったから作られた。
 世界の言語と違う所は、それぞれの言語に生まれた背景と得意分野があるという事だ。
 例えば、今なおプログラマの必須科目と言われているC言語は、元々はアセンブラの代わりとして生まれ、普通のアプリケーションに一般的に使われている言語に比べて、よりハードウェアに近い所で活躍している。
 Visual BasicはそのままBASIC言語の進化した形で、やりたい事を直感的に書けるというコンセプトでMicrosoftが開発したビジネス用言語だ。
 Javaは、C/C++言語をオブジェクトオリエンテッドに完全に書き換えた事と、VMという完全仕様を提供した事で注目され、繁栄や衰退を繰り返しながら、今なおコンピュータ世界の一部で強い勢力を誇っている。

~~~~~~~~

言語 特性 難易度(BASIC言語の知識があるとして)
C言語 汎用(いろいろ使える) 難
VB/VBA アプリ作成 易
VBScript 小ツール作成 易
Pascal アプリ寄り汎用 難
Java アプリ寄り汎用 難
VB.NET アプリ作成 中
C# アプリ作成 難

~~~~~~~~

 最も注目を浴びている言語というのは、最初に記述した通り分野によって違うので何ともいえない。
 君がプログラマやエンジニアを目指すのであれば、JavaとVB.NET(+C#)とC言語は全てマスタしておきたい。
 そうでなく、例えば普段パソコンで行っている業務で機械的な流れ作業を効率化させるようなちょっとしたツールをちゃちゃっと作れて職場のみんなから尊敬されまくりで憧れのあの人も僕の才能にメロメロってのが良いなら、VBAを重点的に勉強しよう。VBAは、比較的簡単で、数行~数十行で劇的に役に立つ物も多い。VBAとは、一般的にMicrosoft Office(WordやExcel)を操作するものだと思ってくれて良いだろう。

 プログラミング言語が多い理由は、世界に人間がしゃべる言語が多いのとほぼ同じだ。それぞれ必要があったから作られた。
 世界の言語と違う所は、それぞれの言語に生まれた背景と得意分野があるという事だ。
 例えば、今なおプログラマの必須科目と言われているC言語は、元々はアセンブラの代わりとして生まれ、普通のアプリケーションに一般的に使われている言語に比べて、よりハードウェアに近い所で活躍している。
 Visual BasicはそのままBASIC言語の進化した形で、やりたい事を直感的に書けるという...続きを読む

QC言語において、関数とその役割、また、引数とその役割、仮引数、実引数とは?

C言語初心者です。
そもそもPC使うのも苦手ですがよろしくお願いします。
C言語において、関数とその役割、また、引数とその役割、仮引数、実引数の役割を、実例を用いて簡潔に説明していただけると助かります。お願いします。

Aベストアンサー

そんなに一気に理解しようとしても難しいですね。
http://www.kyoto-su.ac.jp/~yamada/ap/parameter_argument.html
を眺めてみてください(仮引数と実引数の意味が書いてある。ただしC言語であんまり仮引数がとか実引数が、という言い方はしないような)。
C言語においては全ての処理のかたまりが「関数」です。関数は何かの処理を行って値を返すことも返さないこともあります。
ここの例でいうとf(int x)は値を返す関数、main()は返さない関数で、ここからプログラムの処理が始まります(そういうルールになっている)。
このページのプログラムはちょっと古い書き方なんで今だと警告が出る可能性があります。

QR言語で統計分析を始めたい

カテゴリ違いかもしれませんが、
ここなら適切な回答を頂けると思い質問します。

本日ちょっとした出来事がありまして統計分析とR言語に強烈な興味をもちました。
しかし、残念ながら中学の数学もろくにできないような人間ですので
統計学を学ぶにはどの位のレベルの数学知識が必要かが知りたいです。

今目標としているのは財務省が発表している輸出入貿易統計を使って
今後どの国に何を輸出したらよいかという指標を自分で算出したいと思います。

データ参照元↓(財務省統計ページ)
http://www.e-stat.go.jp/SG1/estat/List.do?lid=000001100843


こういった予測をするのに必要な数学レベルを教えてください
そこから統計分析、R言語と進んで行けたらと思います。
よろしくお願いします。


余談ですが英語が読めたりコピペでVBAプログラムを多少作る事はできます。

Aベストアンサー

統計は、今ある数値を解析するものです。つまり、過去の出来事です。
やりたいことは未来の予測なので統計とは違いますね。
統計手法の中で、大量のマトリックスデーターを使って傾向分析をして、予測をすることができるものとして、近いものとしては、重回帰分析でしょうか。

Q1バイト文字と2バイト文字の区別の仕方

C++についての質問です。
簡単な質問で大変申し訳ございません。

'\'や'&'などSQLインジェクションに
関係する文字コードについて
空白に変換する処理をいれていたところ、
カタカナの「ソ」(%83%5c)など
も変換されてしまい、
文字化けしてしまうという現象が起きています。

'\'は、'%5c'のため、カタカナの「ソ」は、
それと同じ'5c'のコードが
2バイト目入ってしまっているからだと
いう原因までは、
把握しているのですが、
対処の仕方がわかりません。

簡単な質問で申し訳ございませんが
ご教示願います。

Aベストアンサー

 文字コードを空白に変換するというのは危ないのではないでしょうか。文字化けが起きたということはそのコードの中の1ビットが化けたか、データが混入したか、脱落したかが考えられます。それのどれであるかということは前後のデータの並び方から推定する他はないのですが、これはかなり大変な作業になります。
 ですからデータを頭から正しいものと決め込んで特殊コードを空白コードに変換する作業を機械的に行なうということは大変危険な作業であるということになり、文字化けが起きたときには作業を中止し、その原因を推定するルーチンに飛込むようにしなければなりませんね。
 今回の場合はデータがずれてしまっているようですから、これは1ビット脱落したか混入したかのどちからですから、場合に分けたルーチンを用意するのも一つの手段かと思います。
 いずれにせよ、データをいじるのは大変危険な作業なので、薄氷を踏むような用心が必要ということになりますね。
 私が現場でやっていた頃はまだすべて2バイトコードでしたが、それでも血の出るような思いを何度もしたことがあります。御苦労はお察ししますよ。

参考URL:http://home.a03.itscom.net/tsuzu/programing/tips07.htm

 文字コードを空白に変換するというのは危ないのではないでしょうか。文字化けが起きたということはそのコードの中の1ビットが化けたか、データが混入したか、脱落したかが考えられます。それのどれであるかということは前後のデータの並び方から推定する他はないのですが、これはかなり大変な作業になります。
 ですからデータを頭から正しいものと決め込んで特殊コードを空白コードに変換する作業を機械的に行なうということは大変危険な作業であるということになり、文字化けが起きたときには作業を中止し、...続きを読む

Q言語学はなぜ人文科学に分類されているのですか?

言語学は人文科学に分類されるのが一般的なようですが、なぜでしょうか?私の感覚では自然科学のほうがしっくりきます。
ところで、言語学カテゴリがないようですね?

Aベストアンサー

>言語学は人文科学に分類されるのが一般的なようですが、なぜでしょうか?私の感覚では自然科学のほうがしっくりきます。

⇒言語学を表わす英語は、linguisticsとphilologyの2つがありますね。後者philologyは「文献学、言語学」とされるように、民族学や文化人類学と近い関係があって、明らかに人文科学の1つと言えます。が、前者linguisticsは、文字通り「言語の学」で、その研究分野は確かに人文科学と自然科学の両面にまたがります。

 音声学、形態論、意味論など、言語学のどの下位分野をとっても、自然科学的なアプローチと人文科学的なアプローチとがあります。特に、「言語の体系」に注目する際には、それはまさしくおっしゃるような自然科学で、例えば音声学はオシログラフや音響スペクトログラフなどの解析を通じて調音法、合成音の作成、声紋の研究などがなされます。これらはすべて、自然科学的手法で研究するしかありません。

 しかし他方では、言語は心理的存在でもあります。音素とその異音、母音調和、相補分布、中和など…、つまり音韻的弁別特徴などを研究する分野である「音韻論」は人文科学の守備範囲に入ります(ありのままの音声単位の分類と意味を表わす単位としての音素の分類とはまったく違ったものです)。そして、自然科学の音声学と人文科学の音韻論とは、言語の音声研究における車の両輪にたとえられます。どちらか一方だけでは、人間の用いる言語音声の「総合的研究」にはならない、ということでしょうね。なお、この音声学に対する音韻論のように、形態論に対しては形態素論が、意味論に対しては統語論などが組み合わさるだろう、と思います。

 別の術語で言えば、paradigm「パラダイム、構成素」の研究は主として自然科学的に、syntax「シンタックス、構文法」は主として人文科学的に研究される、と言えるのではないでしょうか。以上を要するに、「言語の学」は優れてinterdisciplinary「学際的」な研究テーマである、ということになるものと考えます。

 以上、ご回答まで。

>言語学は人文科学に分類されるのが一般的なようですが、なぜでしょうか?私の感覚では自然科学のほうがしっくりきます。

⇒言語学を表わす英語は、linguisticsとphilologyの2つがありますね。後者philologyは「文献学、言語学」とされるように、民族学や文化人類学と近い関係があって、明らかに人文科学の1つと言えます。が、前者linguisticsは、文字通り「言語の学」で、その研究分野は確かに人文科学と自然科学の両面にまたがります。

 音声学、形態論、意味論など、言語学のどの下位分野をとっても、自然...続きを読む

Q関数の引数と実引数の取り扱いについて

C言語初心者です.
関数の引数と実引数の取り扱いについて,教えていただきたいことがあります.
例えば,2変数の和を求める関数を考えると,以下のようになると思います.
#include <stdio.h>
double sum(double x, double y);

int main(void)
{
double a, b, wa;
a=2.0;
b=3.0;
wa=sum(a,b);
return 0;
}

double sum(double x, double y)
{
double total;
total=x+y;
return total;
}

このとき,mainプログラムでは,a,bふたつの変数を定義しておいて,関数sumに入れて計算させているわけですが,mainプログラムで変数x,yを定義しておいて,以下のようなプログラムにするのはありでしょうか? 参考書などをみると,前者のように取り扱っているようなのですが,試しに後者で実行させてみても同じ結果となりました.

#include <stdio.h>
double sum(double x, double y);

int main(void)
{
double a, b, wa;
a=2.0;
b=3.0;
wa=sum(a,b);
return 0;
}

double sum(double x, double y)
{
double total;
total=x+y;
return total;
}

C言語初心者です.
関数の引数と実引数の取り扱いについて,教えていただきたいことがあります.
例えば,2変数の和を求める関数を考えると,以下のようになると思います.
#include <stdio.h>
double sum(double x, double y);

int main(void)
{
double a, b, wa;
a=2.0;
b=3.0;
wa=sum(a,b);
return 0;
}

double sum(double x, double y)
{
double total;
total=x+y;
return total;
}

このとき,mainプログラムでは,a,bふたつの変数を定義しておいて,関数sumに入れて計算さ...続きを読む

Aベストアンサー

> 以下のようなプログラムにするのはありでしょうか

どちらも全く同じです。
前者は、sum関数呼び出し時の実引数a,bが、それぞれsum関数の仮引数x,yに正しく対応しています。
前者は、sum関数呼び出し時の実引数x,yが、それぞれsum関数の仮引数x,yに正しく対応しています。

ところで、せっかく和の値を求めたのですから、出力する方がよいと思いませんか?


人気Q&Aランキング