输入多个字符串(EOF结束),移位后排序.
eg:
1 zxcvb //zxcvb循环右移1位
2 asdfg
3 qwert
4 poiuyyt
输出为:
//从小到大排序
bzxcv //zxcvb循环右移1位的结果
ertqw
fgasd //asdfg循环右移两位的结果
uyytpoi
//从大到小排序
uyytpoi
fgasd
ertqw
bzxcv
实现的程序如下:
#include <iostream>
#include <string>
#include <algorithm>
#include <memory>
#include <vector>
using std::string;
struct mstring
{
/* data */
std::string s;
int nbit;
};
bool operator<(const mstring & r1, const mstring & r2);
string getstring();
void loopmove(mstring & rr);
int main(){
using namespace std;
int n;
vector<mstring> mvec;
mstring temp;
//检测输入是否为EOF
while (cin >> n, !cin.eof()) {
//cin >> n会留下“ ”或“\n”,所以需要加一个cin.get()
//抛弃多余的字符
cin.get();
temp.nbit = n;
temp.s = getstring();
mvec.push_back(temp);
}
if (mvec.size() > 0) {
//这里不能用新的for循环,因为auto x : mvec
//x并不是mvec里元素的引用,只是一个副本
//loopmove(x)将修改副的内容,而不是原内容
for (auto x = mvec.begin(); x != mvec.end(); ++x)
loopmove(*x);
//sort排序,需要重载<运算符
sort(mvec.begin(), mvec.end());
for (auto x : mvec)
cout << x.s << endl;
cout << endl;
//从大到小排序
sort(mvec.rbegin(), mvec.rend());
for (auto x : mvec)
cout << x.s << endl;
} else
cout << "input no string";
return 0;
}
bool
operator<(const mstring & r1, const mstring & r2){
if (r1.s < r2.s)
return true;
else
return false;
}
string getstring(){
using std::cin;
string s;
char temp[100] = {0};
int ch;
//此处采用分段输入再拼接的形式,防止输入字符串长度超出限制
while ((ch = getchar()) != '\n') {
cin.putback(ch);
cin.get(temp, 100);
s += temp;
}
return s;
}
void loopmove(mstring & rr){
int length = rr.s.size();
rr.nbit %= length;
if (rr.nbit < 1) return;
//将temp初始化为需要移位的部分
//注意此处不能用copy来做,因为temp没有内容空间
string temp(rr.s.end() - rr.nbit, rr.s.end());
//erase() [ end() - nbit, end() )
rr.s.erase(rr.s.end() - rr.nbit, rr.s.end());
//拼接字符串
rr.s = temp + rr.s;
return;
}
需要注意的几点:
- 输入EOF的判断应该在cin之后
- cin >> n 后会留下之后的空格或者回车
- 输入字符传的长度可能超出限制,需要采用get输入,然后判断下一个字符是不是回车来确定一行是否输入完成
- 复制字符串某部分内容可以用初始化来做,不能用copy
- 循环移位不能用新的for循环去完成