C++ 读入整行带空格的字符串,并将字符串按照特定符号划分成多个子串

    在处理输入的时候,有时需要输入一整行字符串,而字符串中包含类似空格,tab这样的特殊符号,直接用cin读入时不能得到预期效果,这里介绍一下C++中的整行字符串读入方法。

istream& getline (istream&  is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);
istream& getline (istream&  is, string& str);
istream& getline (istream&& is, string& str);

注意:delim是结束标志符号,缺省值为'\n'即换行符。

实例代码:

#include <bits/stdc++.h>

using namespace std;

int main(int argc, char *argv[]) {   
  cout << "argc = " << argc << endl;
  for(int i = 0; i < argc; ++i) {
    cout << "argument[" << i << "] : " << argv[i] << endl;
  }
  
  string my_string;

  while(getline(cin, my_string)) {
    cout << my_string << endl;
  }

  return 0;
}


当我们把getline中的缺省值改成'r'时,my_string得到是每行输入字符串中第一个r出现之前的部分,如果第一个字符就是r,则my_string为空串。


getline(cin, my_string, 'r');

值得注意的是,如上例子,第一行读入"You need a rest!"后遇到第一个分割符号'r',此时my_string为"You need a",但是后面的"est!"并没有被忽略到,事实上,my_string会记录两个分割符号之间的所有符号包括回车,不像划分字符串的函数strtok,参数中可以有多个分割符号,所以使用getline()函数的第三个参数时需要注意。


char * strtok ( char * str, const char * delimiters );

注意,这里的参数时char*亦即字符串数组。


#include <bits/stdc++.h>

using namespace std;

int main(int argc, char *argv[]) {
  /**
  cerr << "argc = " << argc << endl;
  for(int i = 0; i < argc; ++i) {
    cerr << "argument[" << i << "] : " << argv[i] << endl;
  }
  ***/
  
  string my_string;

  while(getline(cin, my_string, '\n')) {
    // cout << my_string << endl;
    char *pch;
    cout << "Splitting my_string \'" << my_string << "\' in tokens." << endl;
    
    char str[128];
    // c_str()返回的是一个临时指针,不能直接复制
    strcpy(str, my_string.c_str()); 

    cout << str << endl;

    pch = strtok(str, " -,.");  // 空格,'-',',','.'都是分隔符
    while(pch != NULL) {
      cout << pch << endl;
      pch = strtok(NULL, " -,.");  // 注意这里是NULL
    }
  }

  return 0;
}
测试结果如下:


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值