回答編集履歴
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;
         |