結果
問題 | No.9006 マルチバイト文字テスト(テスト用) |
ユーザー | scrive66 |
提出日時 | 2015-06-04 17:25:29 |
言語 | C++11 (gcc 11.4.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,369 bytes |
コンパイル時間 | 452 ms |
コンパイル使用メモリ | 56,420 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-07-06 14:07:18 |
合計ジャッジ時間 | 817 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | WA | - |
testcase_02 | WA | - |
ソースコード
#include <iostream> #include <string> /*使用する文字コードに応じて定義する*/ #define SHIFT_JIS /*#define EUC*/ /*#define UTF_8*/ /* 参考 http://ash.jp/code/code.htm */ /*次の一文字のバイト数を判定する*/ /*Shift-JIS用*/ #ifdef SHIFT_JIS int mozilen_hantei(const unsigned char* moziretu) { /*文字列終端*/ if (moziretu[0] == 0)return 0; /*次が文字列終端*/ if (moziretu[1] == 0)return 1; if ( ( (moziretu[0] >= 0x81 && moziretu[0] <= 0x9F) || (moziretu[0] >= 0xE0 && moziretu[0] <= 0xEF) ) && ( (moziretu[1] >= 0x40 && moziretu[1] <= 0x7E) || (moziretu[1] >= 0x80 && moziretu[1] <= 0xFC) ) )return 2; /*その他*/ return 1; } #endif /*EUC用*/ #ifdef EUC int mozilen_hantei(const unsigned char* moziretu) { /*文字列終端*/ if (moziretu[0] == 0)return 0; /*次が文字列終端*/ if (moziretu[1] == 0)return 1; if (moziretu[0] == 0x8E && (moziretu[1] >= 0xA1 && moziretu[1] <= 0xDF)) return 2; if ( (moziretu[0] >= 0xA1 && mozireut[0] <= 0xFE) && (moziretu[1] >= 0xA1 && moziretu[1] <= 0xFE) )return 2; if ( moziretu[0] == 0z8F && (moziretu[1] >= 0xA1 && moziretu[1] <= 0xFE) && (moziretu[2] >= 0xA1 && moziretu[2] <= 0xFE) && )return 3; /*その他*/ return 1; } #endif /*UTF-8用*/ #ifdef UTF_8 int mozilen_hantei(const unsigned char* moziretu) { int max, result; for (max = 0; max<6; max++) { if (moziretu[max] == 0)break; } result = 1; if ((moziretu[0] & 0x80) == 0x00)result = 1; else if ((moziretu[0] & 0xE0) == 0xC0 && max >= 2) { if ((moziretu[1] & 0xC0) == 0x80)result = 2; } else if ((moziretu[0] & 0xF0) == 0xE0 && max >= 3) { if ((moziretu[1] & 0xC0) == 0x80 && (moziretu[2] & 0xC0) == 0x80)result = 3; } else if ((moziretu[0] & 0xF8) == 0xF0 && max >= 4) { if ((moziretu[1] & 0xC0) == 0x80 && (moziretu[2] & 0xC0) == 0x80 && (moziretu[3] & 0xC0) == 0x80)result = 4; } else if ((moziretu[0] & 0xFC) == 0xF8 && max >= 5) { if ((moziretu[1] & 0xC0) == 0x80 && (moziretu[2] & 0xC0) == 0x80 && (moziretu[3] & 0xC0) == 0x80 && (moziretu[4] & 0xC0) == 0x80)result = 5; } else if ((moziretu[0] & 0xFE) == 0xFC && max >= 6) { if ((moziretu[1] & 0xC0) == 0x80 && (moziretu[2] & 0xC0) == 0x80 && (moziretu[3] & 0xC0) == 0x80 && (moziretu[4] & 0xC0) == 0x80 && (moziretu[5] & 0xC0) == 0x80)result = 6; } if (result>max)result = max; return result; } #endif int main(void) { std::string inputstr; std::string outputstr; const char* input; int* onelength; char* output; int i, j, len, inputmax; /*入力*/ std::getline(std::cin, inputstr); inputmax = inputstr.size(); input = inputstr.c_str(); onelength = new int[inputmax]; output = new char[inputstr.size() + 100]; /*半角と全角の判定*/ for (i = 0; i<inputmax;) { len = mozilen_hantei((const unsigned char*)&input[i]); onelength[i] = len; for (j = 1; j<len; j++)onelength[i + j] = 0; if (len <= 0)len = 1;/*無限ループ防止*/ i += len; } /*出力文字列の準備*/ len = 0; for (i = inputmax - 1; i >= 0; i--) { if (onelength[i]>0) { for (j = 0; j<onelength[i]; j++) { output[len + j] = input[i + j]; } len += onelength[i]; } } output[len] = 0; outputstr = output; /*メモリ開放*/ delete onelength; delete output; /*出力*/ std::cout << outputstr << std::endl; /*正常終了*/ return 0; }