将C++中的字符串拆分并处理为不同的变量

Split and Process a String in C++ into Different Variables

本文关键字:变量 处理 拆分 C++ 字符串      更新时间:2023-10-16

我有一个文本文件,其中包含一堆数据,实际上是一个学生列表
结构类似于:"姓名"电话"性别"学生ID"电子邮件">

以下是列表示例:

罗杰桥70778745 M 20120345hills@school.edu
Tommy Holness 5127438973 M 20120212tommy@school.edu
李864564456434传真30245678fong@school.edu

数据存储在一个文本文件中,我已经使用getline((函数将每一行转换为字符串。

即:学生[0]包含"Roger Pont 7077874567 M 20120345hills@school.edu">

我的任务是按照StudentID升序对记录进行排序。

我的问题是我想把字符串分成不同的变量类型
然而,由于有些名称之间有更多的空格,并且电话号码由不同的长度组成,因此我不能使用输入和输出流流>>名称[i]>>电话[i]>>性别[i]>>学生ID[i]>>电子邮件[i];

有什么想法可以把字符串分成不同的变量吗?

提前谢谢。

备注:我读过这个(在C++中将字符串拆分为多个变量(,但与这种情况不同的是,我没有特定的模式,比如在表示年龄的整数之前有一个单词"age"。

Roger Pont 70778745 M 20120345 hills@school.edu
Tommy Holness 5127438973 M 20120212 tommy@school.edu
Lee Kin Fong 864564456434 F 30245678 fong@school.edu

从上面的数据来看,如果我们向后处理每一行,那么问题就会变得很容易:

  • 单词拆分到一行。假设字数为N
  • 最后一个单词是电子邮件,即words[N-1]=>电子邮件地址
  • 倒数第二个是studentid,即words[N-2]=>学生id
  • 同样,倒数第三个单词是性别,倒数第四个单词是电话。剩下的单词构成名称

这给了你足够的暗示。

代码:

#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <iterator>
#include <cassert>
struct student
{
  std::string name;
  std::string phone;
  std::string gender;
  std::string student_id;
  std::string email;
};
int main()
{
    std::vector<student> students;
    std::string line;
    while(std::getline(std::cin, line))
    {
        std::istringstream ss(line);
        std::istream_iterator<std::string> begin(ss), end;
        std::vector<std::string> words(begin, end); 
        assert(words.size() >= 5); 
        int n = words.size() - 1;
        student s { words[0], words[n-3], words[n-2], words[n-1], words[n] };
        for (int i = 1 ; i < n - 3 ; i++) s.name += " " + words[i];
        students.push_back(s);
    }
    //printing
    for(auto && s : students)
        std::cout << "name       = " << s.name  << "n"
                  << "phone      = " << s.phone << "n"
                  << "gender     = " << s.gender << "n"
                  << "student_id = " << s.student_id << "n"
                  << "email      = " << s.email << "nn";
}

输入:

Roger Pont 70778745 M 20120345 hills@school.edu
Tommy Holness 5127438973 M 20120212 tommy@school.edu
Lee Kin Fong 864564456434 F 30245678 fong@school.edu

输出:

name       = Roger Pont
phone      = 70778745
gender     = M
student_id = 20120345
email      = hills@school.edu
name       = Tommy Holness
phone      = 5127438973
gender     = M
student_id = 20120212
email      = tommy@school.edu
name       = Lee Kin Fong
phone      = 864564456434
gender     = F
student_id = 30245678
email      = fong@school.edu

在线演示

  • Ideone演示

现在花点时间来理解代码。我向您展示的代码是使用C++11编写的。它展示了现代C++的许多习语。

  • 如何读取文件。一行一行
  • 如何分割一条线,并填充一个字符串向量
  • 如何填充结构(特定于问题(

希望能有所帮助。

#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
    std::vector<std::string> strings;
    std::istringstream f("Roger Pont 70778745 M  20120345 hills@school.edus");
    std::string s;
    while (std::getline(f, s, ' ')) {
        std::cout << s << std::endl;
        strings.push_back(s);
    }

这有一个问题,两个单词之间的间距大于1个空格"。