题意:输入一串字符,包含了名字和出生年份(由一个空格分隔,且名字中可以包含空格),输出从年轻到老的人的名字。
Code:
#include <string>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct stu{
int y;
string name;
};
bool cmp(stu a,stu b){
return a.y>b.y;
}
int main(){
stu q[101];
string str;
int T,i;
cin>>T;
while(T--){
int n;
scanf("%d",&n);
getchar();
for(i=0;i<n;i++){
getline(cin,str);//读入一整行字符串(含空格)
int len=str.length();//获取长度
q[i].y=str[len-4]*1000+str[len-3]*100+str[len-2]*10+str[len-1];//获取年份
q[i].name=str.substr(0,len-5);//截取名字部分的字符
}
sort(q,q+n,cmp);
for(i=0;i<n;i++){
cout<<q[i].name<<endl;
}
}
}
收获:
getline(cin,str)等同于cin.getline(str,x).其中x为要读取的元素个数
strlen()、strcpy()等字符串处理函数,只有字符串数组可以用;size()、length()是string类的方法,只有string类可以用。size()与length()完全等同,遇到空字符不会被截断,可以返回字符串真实长度;strlen()遇到空字符串会被截断,无法返回字符串真实长度。
对字符串后四位特殊处理,从而得到年份
string类中的substr()函数:截取字符串中的子串。如:
string s1=s.substr(4); //从下标4开始一直到结束 string s2=s.substr(5,3); //从下标5开始,3个字符