Created
December 21, 2021 21:29
-
-
Save QuiltMeow/bd9f271bbb14bfa6133db577a5c3ba7c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <iostream> | |
| #include <string> | |
| #include <vector> | |
| using namespace std; | |
| struct SplitResult { | |
| string odd = "", even = ""; | |
| }; | |
| bool isBig5(const string& data) { | |
| unsigned char left = data[0]; | |
| unsigned char right = data[1]; | |
| return ((left >= 0xA4 && left <= 0xC6) || (left >= 0xC9 && left <= 0xF9)) && ((right >= 0x40 && right <= 0x7E) || (right >= 0xA1 && right <= 0xFE)); | |
| } | |
| string reverseString(const string& data) { | |
| vector<string> element; | |
| size_t length = data.length(); | |
| for (size_t i = 0; i < length; ++i) { | |
| if (i >= length - 1) { | |
| element.push_back(string(1, data[i])); | |
| break; | |
| } | |
| string pattern(1, data[i]); | |
| pattern += data[i + 1]; | |
| if (isBig5(pattern)) { | |
| element.push_back(pattern); | |
| ++i; | |
| } | |
| else { | |
| element.push_back(string(1, data[i])); | |
| } | |
| } | |
| reverse(element.begin(), element.end()); | |
| string ret = ""; | |
| int size = element.size(); | |
| for (int i = 0; i < size; ++i) { | |
| ret += element[i]; | |
| } | |
| return ret; | |
| } | |
| int getWordCount(const string& data) { | |
| int ret = 0; | |
| size_t length = data.length(); | |
| for (size_t i = 0; i < length; ++i) { | |
| if (i >= length - 1) { | |
| ++ret; | |
| break; | |
| } | |
| string pattern(1, data[i]); | |
| pattern += data[i + 1]; | |
| if (isBig5(pattern)) { | |
| ++i; | |
| } | |
| ++ret; | |
| } | |
| return ret; | |
| } | |
| SplitResult split(const string& data) { | |
| SplitResult ret; | |
| size_t length = data.length(); | |
| int word = 0; | |
| for (size_t i = 0; i < length; ++i) { | |
| int now = word + 1; | |
| string* target; | |
| if (now % 2 == 0) { | |
| target = &ret.even; | |
| } | |
| else { | |
| target = &ret.odd; | |
| } | |
| if (i >= length - 1) { | |
| *target += data[i]; | |
| break; | |
| } | |
| string pattern(1, data[i]); | |
| pattern += data[i + 1]; | |
| if (isBig5(pattern)) { | |
| *target += pattern; | |
| ++i; | |
| } | |
| else { | |
| *target += data[i]; | |
| } | |
| ++word; | |
| } | |
| return ret; | |
| } | |
| int main() { | |
| string input; | |
| cout << "請輸入一個字串 : "; | |
| getline(cin, input); | |
| cout << endl; | |
| cout << "字串長度 : " << getWordCount(input) << endl; | |
| cout << "字串位元長度 : " << input.length() << endl; | |
| cout << endl; | |
| cout << "字串反轉 : " << reverseString(input) << endl; | |
| SplitResult result = split(input); | |
| cout << "奇數位置字串 : " << result.odd << endl; | |
| cout << "偶數位置字串 : " << result.even << endl; | |
| cout << endl; | |
| system("pause"); | |
| return EXIT_SUCCESS; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment