質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

8330閲覧

C言語で入力された日本語を配列に格納し、格納した配列のデータを表示させる方法が知りたいです。

m0m0

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/08/17 11:04

C言語の学習をしているのですが、以下の問題で詰まってしまい先に進めません。

scanf関数を使用して入力された文字列を配列に格納し、printf関数で配列の中身を表示するプログラムを作成しています。
入力された文字列が英数字なら問題ないのですが、日本語を入力すると、入力した文字が配列に格納されません。
英数字と違って日本語は1文字を表現するのに2~3バイト使用する為、ただscanf関数を使用するだけでは意図した動作にならないということまでは理解できたのですが、具体的にどう作成したコードを修正すれば意図した動作になるのか分かりません。
setlocale関数など使用してみましたが、正確に使い方を理解できていない為か、うまくいきません。
以下に作成したコードを記載しますので、どのように修正を加えたら意図した動作になるかご存知の方いらっしゃいましたら教えていただきたいです。よろしくお願いいたします。

C言語

1#include <stdio.h> 2 3int main(void) 4{ 5 6 char moji[256]; 7 8 scanf("%s",moji); 9 10 printf("%s\n",moji); 11 12 13 return 0; 14 15}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2018/08/17 11:07

うまくいかないときの入力と出力の例を示してくれます?
m0m0

2018/08/17 11:30

はい。以下のように日本語を入力しても何も表示されずに終了してしまいます。
m0m0

2018/08/17 11:30

D:\owner\デスクトップ\C>a あ D:\owner\デスクトップ\C>
m0m0

2018/08/17 11:32

すみません、改行がうまくできておりませんでした。上記の捕捉になりますが、作成したプログラムで「あ」と入力すると、その後に「あ」と表示され終了してほしいところを、何も表示せず終了してしまいます。
episteme

2018/08/17 11:35

Visual C++ 2017 で追試したんですが、僕とこではちゃんと出力されるんよね...
m0m0

2018/08/17 11:41

わざわざ確認ありがとうございます。私は"gcc"を使用しているのですが環境の違いによるものなんでしょうか。コマンドラインアプリケーションを作成してC言語の学習をしようとしていたのですが。。
m0m0

2018/08/17 11:43

どうしても駄目なら違う環境で試すことも選択に入れようと思います。ありがとうございます。
pepperleaf

2018/08/17 12:14

同じく、VC++2017 のコマンドライン (>cl test.c でコンパイル) では問題無く表示。
guest

回答2

0

ベストアンサー

ちょっとちゃんと回答としてまとめ直します。

どうもmingw gccをお使いのようなので、それについて。

まずmingw gccはwchar_t周りのライブラリはただのカカシで全く動かないか例外を投げるかそもそもないかの3択で動くという選択肢がありません。ついでにlocalte周りも"C"しか受け付けないので実質ないのと同じです。

この点MSVCの実装は比較的まともに動きます。


しかしそもそもコンソールアプリケーションを実行するにあたってWindowsの仕様と戦うことになります。

すなわちシェルが使いたい文字コードをサポートしているかと、利用できるフォントが対応している文字範囲はなにか、という問題です。

文字コードについてはchcpコマンドがあり、一見これで解決するように見えます。しかし最近のWindows10以外ではそうは問屋がおろしません。

なぜならまともなフォントが選べないからです。とくにchcp 65001のとき。つまりどうあがいてUnicodeは扱えません。chcp 65001はただのゴミです。いくらC/C++のコードでwchar_tなどを使ったりlocaleで頑張っても無駄です。するとchcp 932に戻ってくるわけですが、やはりいくらC/C++のコードでwchar_tなどを使ったりlocaleで頑張っても内部でSJISに変換されてしまうので結局Unicodeは扱えません。SJISの範囲の文字なら扱えますが。

結局コンソールアプリケーションで文字コードと真面目に向き合うのはあまりにも馬鹿らしいという結論になります。そりゃそうです、バイナリ互換性のためにUnicodeがまともになかった時代から今まで来ているのですから。

なお最近のWindows10ではようやくこの問題をどうにかするべく動き始めたのでそのうちまともにUnicodeが扱える時代が来るかもしれません。イツノコトダロウナ・・・(フォントの問題についてはMigMix2Mを各自で入れてどうにかなるようになったけどその他のバグ踏みそうで触る気が起きない

投稿2018/08/17 14:43

編集2018/08/17 14:47
yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C言語は文字コードに特別なサポートをしていないので、このコードでも一定条件内では正しく動作します。ただしバイト数が255までの入力に限りますし、2バイト目が制御文字になるダメ文字などで問題が発生する可能性があります。

その辺りを正しく扱う場合、wchar_t型またはchar16_t型(Windowsの向け)やchar32_t(Linux/macOS向)を使います。これらはワイド文字といいます。

投稿2018/08/17 11:49

fu7mu4

総合スコア1088

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2018/08/17 11:58

入力をUTF-8にできるならそのまま扱うのがいいですけどね・・・ >バイト数が255までの入力に限りますし 言いたいことはわかるけどわからない・・・
m0m0

2018/08/17 12:06

教えていただきありがとうございます。wchar_t型はlocale.hをインクルードして試してみてはいたのですが、結果は上記に記載した動作と同じでした。char16_t型(Windowsの向け)は試していなかったので、uchar.hをインクルードして試してみたのですが、同じく入力した日本語は表示されずに終了してしまいました。なお、入力している日本語は「ねこ」と入力しています。制御文字は使用しておりません。
yumetodo

2018/08/17 12:24

WindowsなのかなOSは。 wchar_t型版でどういうコードを書いたのか見せてもらっていいですか?
m0m0

2018/08/17 12:27

はい、以下のように書きました。 #include <stdio.h> #include <locale.h> int main(void) { wchar_t moji[256]; scanf("%s",moji); printf("%s\n",moji); return 0; }
episteme

2018/08/17 12:40

書くならこう↓じゃね? (Visual C++ 2017 で動作確認済 #include <stdio.h> #include <locale.h> int main() { wchar_t moji[256]; setlocale(LC_ALL, "ja-JP"); wscanf(L"%s",moji); wprintf(L"%s\n",moji); return 0; }
m0m0

2018/08/17 12:57

> 書くならこう↓じゃね? 書いていただいたソースをコピペして試してみましたが、やはり入力した日本語が表示されずに終了してしまいました。やっぱり環境の問題で、環境を変えなければ解決できない問題なんでしょうか。
rubato6809

2018/08/17 13:04

コマンドプロンプト画面(Powershell画面など?)の文字コード設定が合ってない、とか?
m0m0

2018/08/17 13:07

文字コードはコマンドプロンプトで"chcp 65001"と打ってUTF-8に設定してあります。
rubato6809

2018/08/17 13:11

それ以外の設定を試してみましたか?
m0m0

2018/08/17 13:26

"chcp 932"(shift_jis)で試したところ意図した動作を行いました。 環境の設定が合っていなかったのですね。みなさまいろいろアドバイスして頂きありがとうございました。
退会済みユーザー

退会済みユーザー

2018/08/17 13:26

chcp 932 でデフォルトのコードページに戻せば上手くいくんじゃないですかね?
m0m0

2018/08/17 13:29

ベストアンサーは離席する為、少々お時間をください。本当にありがとうございました。
m0m0

2018/08/17 13:31

> lunatea様 chcp 932がデフォルトなんですね。教えていただきありがとうございます。
yumetodo

2018/08/17 14:05

chcp 65001で上手く行かないの、多分cmd.exeとかのフォントの問題かと。 Windows10のいつからだったかはMigMix2Mを指定するとましになる印象。 というかあのへんの仕様が闇of闇なので手を出してはいけない・・・
yumetodo

2018/08/17 14:08 編集

というかコンソール入力でまともにUnicodeを扱うこと自体が幻想なので諦めてGUI作るほうがきっと幸せになれます。 C++標準化委員会がchar8_t型を入れるまで、そしてまともにロケールが動くようになるまで待ちましょう。 --- ああ、そうだ、ちなみにmingwではwchar_t型周りの実装は全くただのカカシで一切お仕事しないので、もしmingwで扱おうとしているならまずglibcあたりの実装から始めることに(圧倒的死
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問