心得:
当需要得到带空格的字符串是,用getline(cin,str),str是字符串变量名
需要存string.find()返回值时,用string::size_type类型来存
string.find(ch,pos)两个参数,ch表示要查找的字符,pos是开始查找的索引(不写就是从头开始),返回第一次找到的索引
string.substr(pos,len)两个参数,pos表示开始的索引(不写从0开始),len表示子串长度(不写一直结尾),返回一个子串
附:做完这个题一天后,才发stringstream也可以分割字符串(只能以空格分隔),因为stringstream>>str时,遇到空格就停止输入到str
也可以这样:
string s,temp;
vector<string> str;
stringstream ss;
getline(cin,s);
ss<<s;
while(ss>>temp)
str.push_back(temp);
//这样就把分割后的字符串装进容器中了
题目:
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
思路:
首先用一个字符串接受输入(当然是要接收空格的),然后根据空格分割字符串,分割后的子串存到vector容器中,然后在倒序输出就好了
代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
string s;
vector<string> str;
string::size_type pos;//接受索引
getline(cin,s);//可接收带空格的字符串
for(int i=0;i<s.length();i++)
{
pos=s.find(" ",i);//找到空格的索引
if(pos!=s.npos)
{
str.push_back(s.substr(i,pos-i));//将空格前的子串放进容器
}
else//如果没找到空格,说明当前位置是最后一个单词了
{
str.push_back(s.substr(i));//将当前索引到最后索引所有字符串放进容器
break;//因为是最后一个单词了,所以要跳出循环,不然的话随着i++,会把剩下的字母都放进去就错误了
}
i=pos;//重新定位索引的位置
}
reverse(str.begin(),str.end());//翻转容器
for(vector<string>::iterator it=str.begin();it!=str.end();it++)
{
cout<<*it;
if(it!=str.end()-1)
cout<<" ";
}
return 0;
}
另:我这个写法分割时要判断pos找没找到,因为结尾不是空格,所以pos违法无法指向结尾
需要if else,麻烦。其实可以再输入字符串之后在结尾加一个空格,这样pos就可以指向最后一个单词后面,就方便分割了
部分代码:
getline(cin,s);
s+=" ";
for(int i=0;i<s.length();i++)
{
pos=s.find(" ",i);
str.push_back(s.substr(i,pos-i));
i=pos;
}