回答編集履歴

5

情報(主にリンク)追加。

2025/06/09 05:05

投稿

cametan
cametan

スコア57

test CHANGED
@@ -98,8 +98,8 @@
98
98
  ```
99
99
 
100
100
  ```wchar.h```ってヘッダで定義された関数を多用するのが一番信頼性が高いんじゃないか。
101
- んで、読み込みは```scanf```とか```wscanf```を使うよか```fgetws```を使う。バッファ```buffer```を定義してそこに文字列として読み込むんだけど、取り込んだ改行文字を、ワイド文字の終端文字、```L'\0'```へと変換する。
102
- その後、それを数値データに変換するなり、ワイド文字列とするなり、で構造体のスロットに代入するとかコピーする。
101
+ んで、読み込みは```scanf```とか```wscanf```を使うよか[```fgetws```](https://www.ibm.com/docs/ja/i/7.6.0?topic=functions-fgetws-read-wide-character-string-from-stream)を使う。バッファ```buffer```を定義してそこに文字列として読み込むんだけど、取り込んだ改行文字(```L"\n"```)を、[ワイド文字](https://ja.wikipedia.org/wiki/%E3%83%AF%E3%82%A4%E3%83%89%E6%96%87%E5%AD%97)の終端文字、```L'\0'```へと変換する。=> ```L"\n"```の位置検索に[```wcscspn```](https://www.ibm.com/docs/ja/i/7.6.0?topic=functions-wcscspn-find-offset-first-wide-character-match)を使用
102
+ その後、それを数値データに変換する([```wcstol```](https://www.ibm.com/docs/ja/i/7.6.0?topic=lf-wcstol-wcstoll-convert-wide-character-string-long-long-long-integer))なり、ワイド文字列とするなり、で構造体のスロットに代入するとかコピー([```wcscpy```](https://www.ibm.com/docs/ja/i/7.6.0?topic=functions-wcscpy-copy-wide-character-strings))する。
103
103
  かなり面倒くさいんだけど、多分これならどのコンパイラでも動いてくれるんじゃないかな。恐らく。多分。
104
104
 
105
105
  ※: 外野から見ると、Microsoftが提案した機能をCの仕様策定委員会が「敢えて」オプションにしたり、または他のグループが提案したブツもまたオプション化して、Microsoftがそれを実装しなかったり、と、策定委員会がMicrosoft vs. 「その他」に分裂してるように見える。

4

情報更新。コードで構造体の配列をゼロ初期化した。

2025/06/09 04:44

投稿

cametan
cametan

スコア57

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
  int main(void)
44
44
  {
45
- employee_t p[N];
45
+ employee_t p[N] = {0};
46
46
 
47
47
  setlocale(LC_ALL, "");
48
48
 
@@ -109,3 +109,5 @@
109
109
  なお、日本国内では公式ではC言語 = C99なんだけど、長い間Microsoftはキャッチアップして来なかった。現在では最新のC言語仕様はC23と呼ばれるモノだが、Microsoftでは、知ってる限り、現在ではC17に対応はしている。
110
110
 
111
111
  参考: [Visual Studio に C11 および C17 サポートをインストールする](https://learn.microsoft.com/ja-jp/cpp/overview/install-c17-support?view=msvc-170)
112
+
113
+ また、C/C++のライブラリ関数に付いては、[IBMのページ](https://www.ibm.com/docs/ja/i/7.3.0?topic=functions-library)が良くまとまっている。

3

コードを修正

2025/06/09 04:15

投稿

cametan
cametan

スコア57

test CHANGED
@@ -84,9 +84,9 @@
84
84
  for (size_t i = 0; i < N; i++)
85
85
  {
86
86
  wprintf(L"%" PRIo64 L"人目: %ls\n", (uint64_t)(i + 1), p[i].name);
87
+ wprintf(L"年齢: %" PRId16 L"\n", p[i].age);
87
88
  wprintf(L"従業員番号: %" PRId16 L"\n", p[i].num);
88
89
  wprintf(L"部門: %ls\n", p[i].department);
89
- wprintf(L"年齢: %" PRId16 L"\n", p[i].age);
90
90
  wprintf(L"内線番号: %" PRId16 L"\n", p[i].phone);
91
91
  wprintf(L"給与: %" PRId32 L"\n", p[i].salary);
92
92
  }

2

文章修正

2025/06/09 00:56

投稿

cametan
cametan

スコア57

test CHANGED
@@ -12,7 +12,7 @@
12
12
  つまり、Microsoftの処理系が「どう解釈するのか」ってのを熟知せなアカン、って話になるんじゃないかなぁ・・・。
13
13
  多分。
14
14
  C11以降でUTF-8を扱えるようになってる筈、なんだけど、この辺、甚だ不安定なんだよな。仕様上(苦笑)。
15
- よって、前提としては、(日本と違って世界的には)デファクトスタンダードなC99、あるいはJIS C規格を考慮すると、そもそもwchar_tを使わな「数えられない」と思う。
15
+ よって、前提としては、(日本と違って世界的には)デファクトスタンダードなC99、あるいはJIS C規格を考慮すると、そもそも```wchar_t```を使わな「数えられない」と思う。
16
16
  そしてその辺がかなりややこしいんだ。
17
17
 
18
18
  生憎、僕はそんなにCが得意じゃない(どころか嫌いだ・笑)んだけど、調べてみて、ポータブルに書く、って前提だと次のようになるんじゃなかろうか。

1

C99をCと表示変更

2025/06/08 16:47

投稿

cametan
cametan

スコア57

test CHANGED
@@ -18,7 +18,7 @@
18
18
  生憎、僕はそんなにCが得意じゃない(どころか嫌いだ・笑)んだけど、調べてみて、ポータブルに書く、って前提だと次のようになるんじゃなかろうか。
19
19
  詳しい話は識者の人(Cが得意な人)が解説してくれれば嬉しいんだけど(人任せ・笑)・・・。
20
20
 
21
- ```C99
21
+ ```C
22
22
  #include <stdio.h>
23
23
  #include <stdlib.h>
24
24
  #include <inttypes.h>