C++ 处理输入包含特定信息的字符串

在程序测试里,有时候我们会输入一行数字测试, 比如说: 0 1 2 3 4 5 6 7。在上面的例子里面,我们如果只是想得到单一的数字, 直接循环 cin>> 就可以了, 但是如果我们想要的到一个字符串,并且想把字符串里面没有意义的空格去掉,这时普通的操作就比较麻烦了。

有一种很常见的写法是这样的:

string line;
line.erase(remove(line.begin(), line.end(), ' '), line.end());

下面记录一下我就上面的例子中学到的东西:

  • string的erase函数
  • remove()函数

string的erase函数

erase()函数有三个原形

  1. erase(int startPosition, int number)
  2. erase(iterator position)
  3. erase(iterator startPosition, iterator endPosition)

erase()三种对应的用法

  1. 从字符串的startPosition位置开始,删除number个字符串, erase(0, 2)就是删除前两个字符
  2. 从字符串的position位置删除一个字符,注意这个参数类型是iterator
  3. 从字符串的startPosition位置删除到endPosition,注意这两个参数的类型都是iterator

下面是一个示例:

#include<iostream>
using namespace std;

int main(){
    string s = "This is a simple example.";
    string::iterator it;

    cout << s << endl; //This is a simple example. 

    //用第一种方法,从位置9开始,删除7个字符串 
    s.erase(9, 7);
    cout << s << endl; //This is a example.

    //用第二种方法,传入一个iterator,删除它指定位置的字符 
    it = s.begin() + 8;
    s.erase(it);
    cout << s << endl; //This is  exapmle.(is后面有两个空格)

    //用第三种方法,第一个参数表示开始删除的位置,第二个参数表示删到哪里, 类型都是iterator 
    //注意s.end位置是最后的 ".", 把它当成begin()往前数就好了,这个方法是闭区间哦。   
    s.erase(s.begin() + 4, s.end() - 9);
    cout << s << endl;
}

整体的介绍

回到最开始的例子:

line.erase(remove(line.begin(), line.end(), ' '), line.end());

line是一个字符串,调用了这个方法串之后,它就把自己包含的‘ ’(空格)全部删掉了,先看外面, 应该使用的是erase()的第三种方法,去掉了从 remove(line.begin(), line.end(), ’ ‘) 到 line.end() 之间的所有内容。

可见remove方法返回了一个指针。我在Google上查到了这样一个解释:

Briefly, std::remove moves the non-removed items to the front of the vector and returns an iterator pointing just beyond the last unremoved item. Then std::erase trims the vector from that iterator to the end.

相看解释出处请点

简单翻译一下就是 std::remove()方法把没有被删掉的元素移到上面,并且返回了最后一个没有被删除元素的迭代器。关于上面这个例子中的remove()方法的作用应该很容易就看出来,就是删除line.begin()到line.end()之前所有的空格。


所以,如果我们输入:
0 1 2 3 4 5 6 7
然后用这个方法,我们就会得到:
01234567

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值