
VisualStudio2022を用いて、C言語で記述された(拡張子は.c)以下のプログラムの2行目がエラーになります。
char str1[3] = "あ";//エラーはでません。
char str2[5] = "あい";//E0144 型char[7]の値を使用して型char[5]のエンティティを初期化できません
実行は問題なくできているようです。
VisualStudio2019ではエラーにはなりません。
全角2文字がchar[7]になる理由がわからないのですが、教えていただけないでしょうか
No.4ベストアンサー
- 回答日時:
はい、このエラーは特に気にしなくてもよいと思われます。
printf("%d\n", sizeof("あい"));
の結果が5になることは、"あい"の文字コードがシフトJISの「あ」と「い」の2文字分、つまり2バイトであることを示しています。
また、バイナリエディタで開いて確認してみても、1文字2バイトであることも、上記のことから説明がつきます。
つまり、ファイルのエンコードは日本語(シフトJIS)で、文字コードもシフトJISで正しく保存されていることがわかります。
この場合、printf("%s\n", "あい");
の実行結果が「あい」ではなく「あ」と表示されるのは、printf関数の動作の仕方によるものです。
printf関数は、引数に渡された文字列を、画面やファイルなどに出力します。このとき、文字列の文字コードは、プラットフォームの標準文字コードに変換されて出力されます。
Windowsの標準文字コードは、UnicodeのUTF-16LEです。UTF-16LEでは、1文字が2バイトで表現されます。そのため、printf関数でシフトJISの文字列を出力する場合、1文字2バイトのデータが、UTF-16LEの1文字に変換されて出力されます。
このため、printf("%s\n", "あい");
の実行結果は、「あ」と表示されます。
このエラーを解決するには、printf関数の代わりに、fputws関数を使用するとよいでしょう。
fputws関数は、引数に渡された文字列を、画面やファイルなどに出力する関数です。このとき、文字列の文字コードは、そのまま出力されます。
そのため、fputws関数でシフトJISの文字列を出力する場合、1文字2バイトのデータがそのまま出力されます。
具体的には、以下のコードのように記述します。
C
#include <stdio.h>
#include <wchar.h>
int main() {
wchar_t str[] = L"あい";
// printf関数を使用する場合
printf("%s\n", str);
// fputws関数を使用する場合
fputws(str, stdout);
return 0;
}
このコードを実行すると、以下のようになります。
あい
あい
このように、fputws関数を使用すると、printf関数を使用するときと同じように、シフトJISの文字列を正しく出力することができます。
No.3
- 回答日時:
エラーの原因は、VisualStudio2022がデフォルトでUTF-8エンコードを採用していることです。
そのため、char str2[5] = "あい"; と記述すると、"あい" という文字列は UTF-8 で 6 バイト("あ" の 2 バイト + "い" の 2 バイト + null 終端の 1 バイト)になります。つまり、char[5] の配列には収まりきれないため、エラーが発生します。VisualStudio2019 では、デフォルトでシフトJIS エンコードを採用しています。そのため、char str2[5] = "あい"; と記述しても、"あい" という文字列はシフトJIS で 3 バイト("あ" の 1 バイト + "い" の 1 バイト + null 終端の 1 バイト)になるため、エラーは発生しません。
この問題を解決するには、VisualStudio2022 でシフトJIS エンコードを指定するか、または char str2[7] のように配列のサイズを大きくしてあげるとよいでしょう。
具体的には、以下のいずれかの方法で解決できます。
VisualStudio2022 で「名前を付けて保存」⇒「エンコード」で「日本語 (シフトJIS)」を選択して保存する。
VisualStudio2022 で「プロジェクトのプロパティ」を開き、「構成プロパティ」⇒「C/C++」⇒「文字セット」で「シフトJIS」を選択する。
char str2[7] のように配列のサイズを大きくする。
バイナリエディタで確認した結果が 1 文字 2 バイトであることは、UTF-8 エンコードで保存されたことを示しています。シフトJIS エンコードで保存すると、1 文字 1 バイトになります。
早速のご回答ありがとうございます。
補足コメントにも書いたのですが、
このファイルを「名前を付けて保存」⇒エンコード付き保存を選択して、保存すると日本語(シフトJIS)と出てきます。日本語(シフトJIS)で保存後も同じ状態なのですが・・・
バイナリエディタで開いて確認してみても、1文字2バイトです。
更に
printf("%d\n", sizeof("あい"));
の結果は5になります。
上記の結果であれば、このエラーは特に気にしなくてもよいのでしょうか
No.1
- 回答日時:
全角1文字が3バイト、全角2文字と終端文字を合わせて7バイトだとしたら、使用している文字コードがUTF8なのでしょう。
16進数で出力して、自身で確認してみてください。私は確認していません。
・UTF8 文字コード表 3byte
https://orange-factory.com/sample/utf8/code3/e3. …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
char str[256]の256の意味は?
C言語・C++・C#
-
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
ファイルやディレクトリの存在確認を行う方法
C言語・C++・C#
-
-
4
'const char *' 型は 'char *' 型に変換できない ??
C言語・C++・C#
-
5
C言語 配列の長さの上限
C言語・C++・C#
-
6
char AA[]{全角文字"};から"全"という一字を取り出したい"
C言語・C++・C#
-
7
DataGridViewの桁数制限に関して
Visual Basic(VBA)
-
8
【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VisualStudio2022でC言語プログ...
-
C言語 exitの使い方
-
フォームを開くときに、コンボ...
-
VBAでダブルコーテーション入り...
-
COLUMN(1:1)の意味を教え...
-
VBAで配列のNULL判定
-
Accessコンボボックスにレコー...
-
[VBS]変数を定数に変換する方法...
-
excelの、ある数式内の{}の意...
-
VBAのWorksheetFunctionの引数...
-
魔方陣のつくりかた
-
gridViewの行選択解除
-
stdpicture型の変数に、、
-
配列の値を置換するにはどうす...
-
Excel-vba 文字列と変数を...
-
エクセル、この関数の意味は?
-
VB6.0-整数と余りを求める
-
jsp~jspにhiddenを使って変数...
-
C#の問題です。 文字列型の配列...
-
なぜ警告表示?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VisualStudio2022でC言語プログ...
-
Accessで文字列のバイト数読み込み
-
ファイル名について
-
tomcat7 web.xml のエンコード
-
C言語で全角文字を扱いたいので...
-
VC2008+Qtの文字化け
-
Kシェルでの桁数取得
-
スプレッドシートの関数
-
VBA シート上にドロップダウン...
-
Cpadで文字化け
-
VBでまた行き詰まってしまいました
-
Ruby 文字コード判別
-
open-uriを用いた、ウェブ上か...
-
アンダーバーとバックスラッシュ
-
C言語 exitの使い方
-
VBAでダブルコーテーション入り...
-
Excel-vba 文字列と変数を...
-
フォームを開くときに、コンボ...
-
エラーの意味は? Lvalue req...
-
jsp~jspにhiddenを使って変数...
おすすめ情報
このファイルを「名前を付けて保存」⇒エンコード付き保存を選択して、保存すると日本語(シフトJIS)と出てきます。日本語(シフトJIS)で保存後も同じ状態なのですが・・・
バイナリエディタで開いて確認してみても、1文字2バイトです。
printf("%d\n", sizeof("あい"));
の結果は5になります。
すみません。C/C++の項目の中に文字セットが無いのですが。
ただ、ソースファイル自身はシフトJISになっております。