#include #include #include //动态数组 #include #include #include using std::cin; using std::cout; using std::endl; using std::string; using std::vector; using std::max; vector split(const string& s) { //分割字符串,按空格分割成单词,并存储在vector中 vector ret; typedef string::size_type string_size; string_size i = 0; while (i != s.size()) { //忽略前段的空白:[先前的i,i)中全部字符都是空格 while (i != s.size() && isspace(s[i])) { i++; } //找出下一个单词的终结点 string_size j = i; //[先前的j,j)中的任意字符都不是空格 while (j != s.size() && !isspace(s[j])) { j++; } //找到了一些非空白符 if (i != j) { ret.push_back(s.substr(i, j - i)); i = j; } } return ret; } //找出向量中最长字符串的长度 string::size_type width(const vector& v) { //计算字符串向量中最长字符串的长度 string::size_type maxlen = 0; for (vector::size_type i = 0; i != v.size(); ++i) { maxlen = max(maxlen, v[i].size()); } return maxlen; } vector frame(const vector& v) { vector ret; string::size_type maxlen = width(v); //计算每行最长字符串长度 //输出顶部边框 string border(maxlen + 4, '*'); //输出内部的行,每行都用一个星号和一个空格来框起来 ret.push_back(border); //使用迭代器实现 vector::const_iterator iter = v.begin(); while (iter != v.end()) { //每行输出中间的字符串,两边填充空格,使其宽度一致 ret.push_back("* " + (*iter) + string(maxlen - iter->size(), ' ') + " *"); iter++; } ret.push_back(border); return ret; } //纵向连接 vector vcat(const vector& top, const vector& bottom) { vector ret = top; ret.insert(ret.end(), bottom.begin(), bottom.end()); return ret; } //横向连接 vector hcat(const vector& left, const vector& right) { vectorret; //在两幅图案之间留空格 string::size_type width1 = width(left) + 1; //用于遍历left和right的索引 //使用迭代器 vector::const_iterator i, j; i = left.begin(); j = right.begin(); while (i != left.end() || j != right.end()) { string s; if (i != left.end()) { s = *i++; } s += string(width1 - s.size(), ' '); if (j != right.end()) { s += *j++; } ret.push_back(s); } return ret; } int main(int argc, const char* argv[]) { string s; while (getline(cin, s)) { vector v = split(s); vector fra = frame(v); //调用frame对分割后的单词添加框架 vector col, row; col = vcat(v, fra); row = hcat(v, fra); //通过hcat将分割文本和框架化文本并排显示并输出到屏幕上 for (vector::size_type j = 0; j != row.size(); ++j) { cout << row[j] << endl; } } return 0; } #include // 引入标准输入输出流库 #include // 引入字符串库 #include // 引入动态数组(vector)容器库 #include // 引入链表容器库(未使用) #include // 引入算法库(用于std::max) #include // 引入字符处理函数库(用于std::isspace) using std::cin; using std::cout; using std::endl; using std::string; using std::vector; using std::max; // 按空格分割字符串,返回分割后的单词向量 vector split(const string& s) { vector ret; // 存储分割结果 typedef string::size_type string_size; // 定义字符串长度的类型 string_size i = 0; while (i != s.size()) { // 跳过空格 while (i != s.size() && isspace(s[i])) { i++; } // 找到下一个单词的结束位置 string_size j = i; while (j != s.size() && !isspace(s[j])) { j++; } // 如果找到单词,将其添加到结果中 if (i != j) { ret.push_back(s.substr(i, j - i)); // 提取单词并存入向量 i = j; // 更新索引位置 } } return ret; } // 找出向量中最长字符串的长度 string::size_type width(const vector& v) { string::size_type maxlen = 0; // 初始化最大长度为0 for (vector::size_type i = 0; i != v.size(); ++i) { maxlen = max(maxlen, v[i].size()); // 更新最大长度 } return maxlen; } // 为向量中的字符串添加框架(边框) vector frame(const vector& v) { vector ret; // 存储框架化后的字符串 string::size_type maxlen = width(v); // 计算最长字符串长度 string border(maxlen + 4, '*'); // 定义边框字符串 ret.push_back(border); // 添加顶部边框 vector::const_iterator iter = v.begin(); while (iter != v.end()) { // 每行添加左右边框和适当的填充 ret.push_back("* " + (*iter) + string(maxlen - iter->size(), ' ') + " *"); iter++; } ret.push_back(border); // 添加底部边框 return ret; } // 纵向连接两个字符串向量 vector vcat(const vector& top, const vector& bottom) { vector ret = top; // 初始化结果为顶部向量 ret.insert(ret.end(), bottom.begin(), bottom.end()); // 添加底部向量 return ret; } // 横向连接两个字符串向量 vector hcat(const vector& left, const vector& right) { vector ret; string::size_type width1 = width(left) + 1; // 为左侧添加一个空格的宽度 vector::const_iterator i = left.begin(), j = right.begin(); // 同时遍历左、右向量 while (i != left.end() || j != right.end()) { string s; if (i != left.end()) { s = *i++; // 获取左侧字符串 } s += string(width1 - s.size(), ' '); // 填充空格以对齐 if (j != right.end()) { s += *j++; // 添加右侧字符串 } ret.push_back(s); // 将拼接后的字符串添加到结果 } return ret; } int main(int argc, const char* argv[]) { string s; while (getline(cin, s)) { // 按空格分割输入字符串 vector v = split(s); // 为分割后的字符串添加框架 vector fra = frame(v); // 纵向连接原始字符串和框架化字符串 vector col = vcat(v, fra); // 横向连接原始字符串和框架化字符串 vector row = hcat(v, fra); // 输出横向连接后的结果 for (vector::size_type j = 0; j != row.size(); ++j) { cout << row[j] << endl; } } return 0; }