Skip to content

Instantly share code, notes, and snippets.

@QuiltMeow
Created December 21, 2021 21:29
Show Gist options
  • Select an option

  • Save QuiltMeow/bd9f271bbb14bfa6133db577a5c3ba7c to your computer and use it in GitHub Desktop.

Select an option

Save QuiltMeow/bd9f271bbb14bfa6133db577a5c3ba7c to your computer and use it in GitHub Desktop.
#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