質問するログイン新規登録

回答編集履歴

4

用語の修正

2025/08/29 05:22

投稿

little_street
little_street

スコア533

answer CHANGED
@@ -64,7 +64,7 @@
64
64
 
65
65
  (追記)
66
66
 
67
- `_setmode()` を使うとマルチバイト文字列(UTF-8)からワイド文字列(Windows: UTF-16)へ変換できると教えていただいたので,指摘されていたサロゲートペア文字(例えば辰𠮷𠀋一郎さんの「𠮷」や「𠀋」などで,ワイド文字のペアに変換される)に対応する記述例を「該当のソースコード」に追記する形で簡単な実行例とともに示します。なお,サロゲートペア文字がエンコードされているワイド文字ペアの1文字目の値は「0xD800 〜 0xDBFF」(2文字目の値は「0xDC00 〜 0xDFFF」)の範囲であることを用いています。
67
+ `_setmode()` を使うとマルチバイト文字列(UTF-8)からワイド文字列(Windows: UTF-16)へ変換できると教えていただいたので,指摘されていたサロゲートペア文字(例えば辰𠮷𠀋一郎さんの「𠮷」や「𠀋」などで,ワイド文字のペアに変換される)に対応する記述例を「該当のソースコード」に追記する形で簡単な実行例とともに示します。なお,サロゲートペア文字が変換されているワイド文字ペアの1文字目の値は「0xD800 〜 0xDBFF」(2文字目の値は「0xDC00 〜 0xDFFF」)の範囲であることを用いています。
68
68
 
69
69
  ```C
70
70
  #include <stdio.h>

3

用語の修正

2025/08/29 05:21

投稿

little_street
little_street

スコア533

answer CHANGED
@@ -64,7 +64,7 @@
64
64
 
65
65
  (追記)
66
66
 
67
- `_setmode()` を使うとマルチバイト文字列(UTF-8)からワイド文字列(Windows: UTF-16)へ変換できると教えていただいたので,指摘されていたサロゲートペア文字(例えば辰𠮷𠀋一郎さんの「𠮷」や「𠀋」などで,ワイド文字のペアにエンコードされる)に対応する記述例を「該当のソースコード」に追記する形で簡単な実行例とともに示します。なお,サロゲートペア文字がエンコードされているワイド文字ペアの1文字目の値は「0xD800 〜 0xDBFF」(2文字目の値は「0xDC00 〜 0xDFFF」)の範囲であることを用いています。
67
+ `_setmode()` を使うとマルチバイト文字列(UTF-8)からワイド文字列(Windows: UTF-16)へ変換できると教えていただいたので,指摘されていたサロゲートペア文字(例えば辰𠮷𠀋一郎さんの「𠮷」や「𠀋」などで,ワイド文字のペアに変換される)に対応する記述例を「該当のソースコード」に追記する形で簡単な実行例とともに示します。なお,サロゲートペア文字がエンコードされているワイド文字ペアの1文字目の値は「0xD800 〜 0xDBFF」(2文字目の値は「0xDC00 〜 0xDFFF」)の範囲であることを用いています。
68
68
 
69
69
  ```C
70
70
  #include <stdio.h>

2

追記

2025/08/29 05:13

投稿

little_street
little_street

スコア533

answer CHANGED
@@ -61,3 +61,84 @@
61
61
  文字列を入力してください:しんぶんし
62
62
  回文です。
63
63
  ```
64
+
65
+ (追記)
66
+
67
+ `_setmode()` を使うとマルチバイト文字列(UTF-8)からワイド文字列(Windows: UTF-16)へ変換できると教えていただいたので,指摘されていたサロゲートペア文字(例えば辰𠮷𠀋一郎さんの「𠮷」や「𠀋」などで,ワイド文字のペアにエンコードされる)に対応する記述例を「該当のソースコード」に追記する形で簡単な実行例とともに示します。なお,サロゲートペア文字がエンコードされているワイド文字ペアの1文字目の値は「0xD800 〜 0xDBFF」(2文字目の値は「0xDC00 〜 0xDFFF」)の範囲であることを用いています。
68
+
69
+ ```C
70
+ #include <stdio.h>
71
+ #include <wchar.h>
72
+ #include <locale.h>
73
+ #ifdef _WIN32
74
+ #include <fcntl.h>
75
+ #include <io.h>
76
+ #endif
77
+
78
+ int main(void) {
79
+ wchar_t str[256];
80
+ size_t len;
81
+
82
+ setlocale(LC_ALL, "");
83
+ #ifdef _WIN32
84
+ if (_setmode(_fileno(stdin), _O_U8TEXT) == -1) {
85
+ fprintf(stderr, "error: cannat set mode.\n");
86
+ return 1;
87
+ }
88
+ #endif
89
+
90
+ wprintf(L"文字列を入力してください:");
91
+ fgetws(str, 256, stdin);
92
+
93
+ // 改行削除
94
+ len = wcslen(str);
95
+ if (len > 0 && str[len - 1] == L'\n') {
96
+ str[len - 1] = L'\0';
97
+ len--;
98
+ }
99
+
100
+ // 回文判定
101
+ int is_palindrome = 1;
102
+ size_t left = 0, right = len - 1;
103
+ while (left < right) {
104
+ #ifdef _WIN32
105
+ if (str[left] >= 0xD800 && str[left] <= 0xDBFF) {
106
+ if (str[left] != str[right - 1] || str[left + 1] != str[right]) {
107
+ is_palindrome = 0;
108
+ break;
109
+ }
110
+ left += 2;
111
+ right = right < 2 ? 0 : right - 2;
112
+ continue;
113
+ }
114
+ #endif
115
+ if (str[left] != str[right]) {
116
+ is_palindrome = 0;
117
+ break;
118
+ }
119
+ left++;
120
+ right--;
121
+ }
122
+
123
+ if (is_palindrome)
124
+ wprintf(L"回文です。\n");
125
+ else
126
+ wprintf(L"回文ではありません。\n");
127
+
128
+ return 0;
129
+ }
130
+ ```
131
+
132
+ ```PowerShell
133
+ PS > chcp
134
+ Active code page: 65001
135
+ PS > gcc --version
136
+ clang version 20.1.8
137
+ PS > gcc main.c
138
+ PS > .\a.exe
139
+ 文字列を入力してください:吉𠀋𠮷𠀋吉𠀋吉
140
+ 回文ではありません。
141
+ PS > .\a.exe
142
+ 文字列を入力してください:吉𠀋𠮷丈𠮷𠀋吉
143
+ 回文です。
144
+ ```

1

書式の改善

2025/08/25 09:58

投稿

little_street
little_street

スコア533

answer CHANGED
@@ -9,7 +9,8 @@
9
9
 
10
10
  #define N_STR 1024
11
11
 
12
- int main(void) {
12
+ int main(void)
13
+ {
13
14
  char str[N_STR];
14
15
  int str_len, len, is_palindrome;
15
16
  int c, i, j, k;