想用一个循环遍历string,大家看看这是为什么。。

程序猿Theg 2013-10-24 05:39:36
string s=“a a a a”;
auto beg=s.begin();
while(beg!=s.end()){
stemp.clear();
while(beg!=s.end() && *beg==' '){//为什么执行完这两个循环的时候已经到end了??????
++beg;
}
while(beg!=s.end() && *beg!=' '){
stemp+=*beg;
++beg;
}
if(beg==s.end()){cout<<"x";}//这里是为了检验才写的,结果中只输出了一次x,也就是循环只执行了一次就到尾了,不应该啊

教教我为什么,谢谢了
...全文
201 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序猿Theg 2013-10-24
  • 打赏
  • 举报
回复
已经解决了,应该用getline()谢谢大家了
程序猿Theg 2013-10-24
  • 打赏
  • 举报
回复
引用 6 楼 starytx 的回复:
[quote=引用 5 楼 starytx 的回复:] 1.你的代码要干啥?把非空格字符选出来放到stemp里边?可你的stemp没进行一次最外层循环就清空一次,所以你的stemp只能收集到最后一个非空字符。 2.内部的第一个循环没有必要再检查是否到尾部。 3.因为你最后cout的条件是循环到了尾部,所以肯定只会输出一次,因为只会到尾部一次。
不好意思,看错了,第二条忽略。[/quote] 我是为了找到一行字符串中连续重复最多的那个单词,代码有点长,我就弄上了这一点儿,全部的代码是这样的,我好像记起来了,我输入的时候用的是cin>>s但是好像会把空格忽略掉是吗?应该用getline()吧?
#include<iostream>
#include<string>
using namespace std;

int main(){
	string s;
	string smax,scurmax,stemp;
	int max=0,curmax=0;
	cin>>s;
	auto beg=s.begin();
	while(beg!=s.end()){
		stemp.clear();
		while(beg!=s.end() && *beg==' '){//为什么执行完这两个循环的时候已经到end了??????
			++beg;
		}
		while(beg!=s.end() && *beg!=' '){
			stemp+=*beg;
			++beg;
		}
		if(beg==s.end()){cout<<"x";}
		cout<<stemp<<endl;
		if(stemp==scurmax){
			++curmax;
		}
		else
		{
			scurmax=stemp;
			curmax=1;
		}
		if(curmax>max){
			max=curmax;
			smax=scurmax;
			//cout<<smax<<" "<<max<<endl;
		}
		
	}

	cout<<"the word "<<smax<<" occurred "<<max<<" times"<<endl;

	return 0;
}
starytx 2013-10-24
  • 打赏
  • 举报
回复
引用 5 楼 starytx 的回复:
1.你的代码要干啥?把非空格字符选出来放到stemp里边?可你的stemp没进行一次最外层循环就清空一次,所以你的stemp只能收集到最后一个非空字符。 2.内部的第一个循环没有必要再检查是否到尾部。 3.因为你最后cout的条件是循环到了尾部,所以肯定只会输出一次,因为只会到尾部一次。
不好意思,看错了,第二条忽略。
starytx 2013-10-24
  • 打赏
  • 举报
回复
1.你的代码要干啥?把非空格字符选出来放到stemp里边?可你的stemp没进行一次最外层循环就清空一次,所以你的stemp只能收集到最后一个非空字符。 2.内部的第一个循环没有必要再检查是否到尾部。 3.因为你最后cout的条件是循环到了尾部,所以肯定只会输出一次,因为只会到尾部一次。
程序猿Theg 2013-10-24
  • 打赏
  • 举报
回复
引用 3 楼 stereoMatching 的回复:

std::string s= "a a a a";
    std::string stemp;
    auto beg = s.begin();
    while(beg != s.end()){
        //stemp.clear();
        while(beg !=s.end() && *beg==' '){//为什么执行完这两个循环的时候已经到end了??????
            ++beg;
        }
        while(beg!=s.end() && *beg!=' '){
            stemp+=*beg;
            ++beg;
        }
    }
    std::cout<<stemp<<std::endl;
执行结果是正常的 "aaaa" 还有,用std::remove和std::remove_copy会更容易

std::string s = "a a a a";
    std::string stemp;

    std::remove_copy(std::begin(s), std::end(s), std::back_inserter(stemp), ' ');
    std::cout<<stemp<<std::endl;

    s.erase((std::remove(std::begin(s), std::end(s), ' ')), std::end(s));
    std::cout<<s<<std::endl;
也就是说会把string中的空格忽略掉吗?
stereoMatching 2013-10-24
  • 打赏
  • 举报
回复

std::string s= "a a a a";
    std::string stemp;
    auto beg = s.begin();
    while(beg != s.end()){
        //stemp.clear();
        while(beg !=s.end() && *beg==' '){//为什么执行完这两个循环的时候已经到end了??????
            ++beg;
        }
        while(beg!=s.end() && *beg!=' '){
            stemp+=*beg;
            ++beg;
        }
    }
    std::cout<<stemp<<std::endl;
执行结果是正常的 "aaaa" 还有,用std::remove和std::remove_copy会更容易

std::string s = "a a a a";
    std::string stemp;

    std::remove_copy(std::begin(s), std::end(s), std::back_inserter(stemp), ' ');
    std::cout<<stemp<<std::endl;

    s.erase((std::remove(std::begin(s), std::end(s), ' ')), std::end(s));
    std::cout<<s<<std::endl;
程序猿Theg 2013-10-24
  • 打赏
  • 举报
回复
引用 1 楼 wangdahu888 的回复:
while(beg!=s.end() && *beg==' '){//为什么执行完这两个循环的时候已经到end了?????? ++beg; } 迭代器已经指向尾部了,下面的循环就不能运行了呀 while(beg!=s.end() && *beg!=' '){ stemp+=*beg; ++beg; }
可是如果s里面不是空格的话不就不循环了吗?上面那个循环是用来跳过空格的。给我讲讲哈
  • 打赏
  • 举报
回复
while(beg!=s.end() && *beg==' '){//为什么执行完这两个循环的时候已经到end了?????? ++beg; } 迭代器已经指向尾部了,下面的循环就不能运行了呀 while(beg!=s.end() && *beg!=' '){ stemp+=*beg; ++beg; }

64,647

社区成员

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

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