C++ 输入多个字符串,移位后再排序输出(正反排序都要输出)

输入多个字符串(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循环去完成

猜你喜欢

转载自blog.csdn.net/pix_csdn/article/details/89846673