把一个string中的各个单词保存到一个vector中,无法识别空格的问题?

yangxuefeng09 2015-01-06 06:36:25

#include "iostream"
#include "vector"
#include "string"
#include "list"
#include "deque"
using namespace std;
/*
已知有如下 string 对象:
string line1 = "We were her pride of 10 she named us:";
string line2 = "Benjamin, Phoenix, the Prodigal"
string line3 = "and perspicacious pacific Suzanne";
string sentence = line1 + ' ' + line2 + ' ' + line3;
编写程序计算 sentence 中有多少个单词,并指出其中
最长和最短的单词。如果有多个最长或最短的单词,则
将它们全部输出。
*/
int main()
{
string line1 = "We were her pride of 10 she named us:";
string line2 = "Benjamin, Phoenix, the Prodigal" ;
string line3 = "and perspicacious pacific Suzanne";
string sentence = line1 + ' ' + line2 + ' ' + line3;
cout<<sentence<<endl;

string alpha("qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM");
string alpha_not("' ';,: \t\v\r\n\f");
char kongge=' ';
string::size_type pos=0;

string temp;
string result;
vector<string> vs;

while(pos!=sentence.size())
{
if ((pos=sentence.find_first_of(alpha,pos))!=string::npos)//如果找到的是一个字母
{
temp=temp+sentence[pos];//提取单词
}
else
{//如果提取的是空格 数字 : , 等等非字母的字符 那么就把这个单词 保存到vector中

result=temp+'\0';
vs.push_back(result);
temp.clear();
}
++pos;
}
int i=0;
for (vector<string>::iterator iter=vs.begin();iter!=vs.end();++iter)
{
cout<<*iter<<" ";
++i;
if (i=5)
{
cout<<endl;
}
}


return 0;
}




这段代码想要实现的功能是:

把一个string中的各个单词保存到一个vector<string>中,比如这个字符串最开始的东西是we 因为w是字母所以会保存到temp中,接下来是e因为也是一个字母,所以仍然会加到temp中,这个时候temp变成 we 但是接下来是一个空格 是一个非字母的字符了 所以应该把前面的temp中的we保存到vector中 ,然后让++pos这样又读到下一个字母了


但是实际上这个程序运行的时候,遇到空格的时候并不执行else部分的内容 ,反而好像是把空格略过了 这样单词一直累加到temp中 这样temp中最后就是没有符号的一个串

请问 问题出在哪里 如何解决 ???

请一定要在现有的方法上解决 谢谢各位前辈

...全文
405 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly_dragon_fly 2015-01-07
  • 打赏
  • 举报
回复
将部分代码替换成这样就可以了,你原来的find用法不对

 while(pos!=sentence.size())
    {
        if (alpha.find(sentence[pos])!=string::npos)//如果找到的是一个字母
        {
            temp=temp+sentence[pos];//提取单词
        }
        else
        {//如果提取的是空格   数字  :   , 等等非字母的字符    那么就把这个单词   保存到vector中

                //result=temp+'\0';
                if(temp.size())
                    vs.push_back(temp);
                temp.clear();
        }
        ++pos;
    }
    if(temp.size())
        vs.push_back(temp);
    int i=0;
动力风暴 2015-01-06
  • 打赏
  • 举报
回复
楼主的字符串分割成单词不对~~~我不是前辈,试了半天还没改好……现在要回去了,改天再来看看~~ 首先cout<<string::npos<<endl;会是一个很大的数,所以if条件总是成立的。 下面是我试单词分割的程序,还有点问题,最后一个单词会出错:

#include <iostream>
#include <string>
using namespace std;
void main(){
	string line1 = "We were her pride of 10 she named us:"; 
	int pos=0,begin,end;
	string temp;
	while(line1[pos])
	{
		if(line1[pos]!=' ')
		{
			begin=pos;
			while(line1[pos]&&line1[pos]!=' ')
				pos++;
			pos=pos-1;//遇到空格符回退一个
			end=pos;
		}
		while(begin<=end){
			temp=temp+line1[begin];
			begin++;
		}
		cout<<temp<<endl;
		temp.clear();
		pos++;
	}
}
勤奋的小游侠 2015-01-06
  • 打赏
  • 举报
回复
因为你的逻辑有问题。 if ((pos=sentence.find_first_of(alpha,pos))!=string::npos) 你没有理解find_first_of函数的作用,你的这个if语句基本上就没有不成立的时候。 自己百度find_first_of的作用。
yangxuefeng09 2015-01-06
  • 打赏
  • 举报
回复
引用 1 楼 fly_dragon_fly 的回复:
用stringstream
不能用stringstream 要是能用stringstream的话,那么这个问题早就解决了 这个问题不是为了解决实际问题 就是为了 纯粹的做题 如果用stringstream 或者 istream getline 等等 就没意思了
fly_dragon_fly 2015-01-06
  • 打赏
  • 举报
回复
用stringstream

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧