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

博客介绍输入多个字符串(以EOF结束),经移位后排序的程序实现。强调输入EOF判断应在cin之后,cin后会留空格或回车,输入字符串长度可能超限制,要用get输入并判断回车确定行输入完成,复制内容用初始化,循环移位不用新for循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入多个字符串(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循环去完成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值