免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: iacxin099
打印 上一主题 下一主题

[C++] C++ string 判断多个空格问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-11-26 14:13 |只看该作者
boyatchinaunix 发表于 2013-11-26 13:39
char * p= strstr(str,“两个空格” );
*p = 0;


这是一个最简单的实现方式。

  1. char *str = "123 bei jing       this";
  2. char *p = str;
  3. unsigned short dblSpace = ((unsigned short)' ') << 8 + ' ';
  4. while(*p)
  5. {
  6.     if (*((unsigned short *)p) == dblSpace)
  7.     {
  8.         *p = 0;
  9.         break;
  10.     }
  11. }
复制代码
这个的效率可能会好些。

论坛徽章:
0
12 [报告]
发表于 2013-11-26 14:14 |只看该作者
iacxin099 发表于 2013-11-26 14:03
楼上几位太自以为是了,是不是高手,把代码贴出来,只会讽刺别人,素质也是不高的。
每个人的实现方 ...


不是高手,只是抛砖引玉

论坛徽章:
0
13 [报告]
发表于 2013-11-26 14:39 |只看该作者
这是我的实现方式,我发贴是为了讨论更好的实现方式。
  1. string str="123 bei jing       this";
  2.         size_t pos=0;
  3.         for (size_t i=0;i<str.size();++i)
  4.         {
  5.                 if (str[i] == ' ')
  6.                 {
  7.                         if (((i+1)<str.size())&&(str[i+1] == ' '))
  8.                         {
  9.                                 pos = i;
  10.                                 break;
  11.                         }
  12.                 }
  13.         }
  14.         str = str.substr(0,pos);
  15.         cout<<str<<endl;
复制代码
我是想知道能不能通过STL,两三行实现。不行也就这种方式了。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
14 [报告]
发表于 2013-11-26 14:56 |只看该作者
空格是指 is_space么?
还是单纯的 &#32;??

论坛徽章:
0
15 [报告]
发表于 2013-11-26 14:57 |只看该作者
iacxin099 发表于 2013-11-26 14:39
这是我的实现方式,我发贴是为了讨论更好的实现方式。我是想知道能不能通过STL,两三行实现。不行也就这种方 ...


你这是最“朴实”的思路。
即使使用这种思路,可以优化一下。

  1.         string str="123 bei jing       this";

  2.         size_t pos=-1;  //没找到的情况下,为-1
  3.         size_t len = str.size() - 1; //不要把计算长度的运行放到循环中。-1是为了可以比较2个字符

  4.         for (size_t i=0;i<len;++i)
  5.         {
  6.                 if (str[i] == '  ' && str[i+1]== '  ' )
  7.                 {
  8.                         pos = i;
  9.                         break;
  10.                 }
  11.         }

  12.         if(pos !=-1)  //判断是否找到
  13.             str = str.substr(0, pos);

  14.         cout<<str<<endl;
复制代码

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
16 [报告]
发表于 2013-11-26 15:10 |只看该作者
boyatchinaunix 发表于 2013-11-26 14:13
这是一个最简单的实现方式。这个的效率可能会好些。


循环少了p++,这么优化存在不对齐访问,移植性有问题

论坛徽章:
0
17 [报告]
发表于 2013-11-26 15:14 |只看该作者
hellioncu 发表于 2013-11-26 15:10
循环少了p++,这么优化存在不对齐访问,移植性有问题


确实有问题,仔细看的话,问题更多,临时写几句,说明一下意思而已。:wink: 。

论坛徽章:
0
18 [报告]
发表于 2013-11-26 15:18 |只看该作者
hellioncu 发表于 2013-11-26 15:10
循环少了p++,这么优化存在不对齐访问,移植性有问题


高手终于出现了,好多牌牌

论坛徽章:
0
19 [报告]
发表于 2013-11-26 17:12 |只看该作者
本帖最后由 icosagon 于 2013-11-26 17:24 编辑
  1. string str= "123 bei jing       this"
  2. vector<string> split_strs;
  3. boost::algorithm::split_regex(split_strs, str, boost::regex("[ ]{2,}"));
  4. cout << split_strs[0] << endl;
复制代码
使用boost的字符串算法库,几行就搞定了

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
20 [报告]
发表于 2013-11-26 17:20 |只看该作者
本帖最后由 w_anthony 于 2013-11-26 17:26 编辑

既然LZ有思考过,那么对不起了,我误会了
str.resize(str.find("  "));
不过一句话就搞定的事情,也要纠结什么效率问题么?
------------------
不好意思,漏了找不到的情况
应该是
const size_t pos = str.find("  ");
if (pos != std::string::npos)
    str.resize(pos);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP