
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# 【至急】C言語の問題です、どなたか分かる方いませんか? 以下のコードは配列abcdeをbodesにず 1 2023/11/08 14:05
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# C言語について 6 2023/11/29 14:02
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VisualStudio2022でC言語プログ...
-
Ruby 文字コード判別
-
Accessで文字列のバイト数読み込み
-
Ruby1.9で文字列の置換がうまく...
-
VBAでダブルコーテーション入り...
-
C言語 exitの使い方
-
VBAのWorksheetFunctionの引数...
-
VB6.0-整数と余りを求める
-
フォームを開くときに、コンボ...
-
EXCEL/VBA 変数の値をクリップ...
-
配列の値を置換するにはどうす...
-
Excel-vba 文字列と変数を...
-
C言語 アロー演算子について質...
-
C#で動的にコントロールを取得...
-
c言語で乱数を扱うときの
-
[VBS]変数を定数に変換する方法...
-
processing エラーで、 "cannot...
-
VB 配列の内容をファイルに書...
-
レジストリの値獲得について
-
DataTableの値を変数に代入したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VisualStudio2022でC言語プログ...
-
Accessで文字列のバイト数読み込み
-
HTML5では文中の半角不等号はち...
-
アンダーバーとバックスラッシュ
-
Cpadで文字化け
-
Ruby 文字コード判別
-
PHP "機能"という文字を変数に...
-
C言語で全角文字を扱いたいので...
-
英数半角文字と「-」を指定する...
-
rubyの正規表現で"["を使いたい...
-
VBA シート上にドロップダウン...
-
C言語 exitの使い方
-
VBAでダブルコーテーション入り...
-
フォームを開くときに、コンボ...
-
Excel-vba 文字列と変数を...
-
excelの、ある数式内の{}の意...
-
エラーの意味は? Lvalue req...
-
配列の値を置換するにはどうす...
-
jsp~jspにhiddenを使って変数...
-
EXCEL/VBA 変数の値をクリップ...
おすすめ情報
このファイルを「名前を付けて保存」⇒エンコード付き保存を選択して、保存すると日本語(シフトJIS)と出てきます。日本語(シフトJIS)で保存後も同じ状態なのですが・・・
バイナリエディタで開いて確認してみても、1文字2バイトです。
printf("%d\n", sizeof("あい"));
の結果は5になります。
すみません。C/C++の項目の中に文字セットが無いのですが。
ただ、ソースファイル自身はシフトJISになっております。