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