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 

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;
}

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


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


getline(cin, my_string, 'r');

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

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


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

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


#include 

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;
}
测试结果如下:

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

你可能感兴趣的:(C/C++)