最简单的通过空格分隔字符串的方法是什么?

3

我已经很久没用C++了,最近在业余时间使用Javascript,现在我不确定我还记得多少C++知识。

基本上我只需要通过查看空格将字符串分成几个部分。

所有我看到的链接都是自己编写的函数,但我确信可以使用标准库来使用流的方式完成,但我再次回想起来有些困难,我的谷歌搜索结果也没有帮助。

请注意,我提取的不是流,而只是一个字符串,比如“Bob Accountant 65 retired”,我必须将字符串中的每个项目提取到它自己的数据字段中。我一直在尝试用ifstream和ofstream,但我甚至不确定我在做什么,因为我忘记了语法。


3
可以使用 strtok 函数。http://www.cplusplus.com/reference/cstring/strtok/ - thefourtheye
我该如何将我的字符串转换为字符指针呢? - Turner Houghton
std::string::c_str() 将返回一个以 null 字符结尾的字符串,可用于 C 标准库函数中需要以 null 字符结尾的字符串(例如 strtok)的情况。请注意,strtok(...) 在其 通常 形式下 不是线程安全的,因此建议以下建议使用 C++ stdlib 更加灵活/健壮。 - Andon M. Coleman
3个回答

5

std::strtok 是 C 语言风格的方法。你可能想使用 std::stringstream,例如:

#include <sstream>
#include <string>
#include <iostream>

int main() {
    std::string input = "foo bar baz  quxx\nducks";
    std::stringstream ss(input);

    std::string word;
    while (ss >> word) {
        std::cout << word << '\n';
    }
}

当运行时,它显示:
foo
bar
baz
quxx
ducks

如果您想从一个std::stringstream(或任何类型的std::istream,真正的)中读取数据到特定的数据类型中,您可以按照@JerryCoffin的卓越建议重载流的operator>>以适应您的数据类型:

#include <sstream>
#include <string>
#include <iostream>

struct Employee {
    std::string name;
    std::string title;
    int age;
    std::string status;
};

std::istream& operator>>(std::istream &is, Employee &e) {
    return is >> e.name >> e.title >> e.age >> e.status;
}

int main() {
    std::string input = "Bob Accountant 65 retired";
    std::stringstream ss(input);

    Employee e;
    ss >> e;

    std::cout << "Name: " << e.name
        << " Title: " << e.title
        << " Age: " << e.age
        << " Status: " << e.status
        << '\n';
}

如果我只是想将它们放在自己的数据字段中,而不是显示到控制台上,该怎么做? - Turner Houghton
使用std::vector<string> stringVect;代替调用cout,你应该调用stringVect.push_back()。 - qxixp
@user2419560:我更新了这个答案,包括读取数据到结构体的第二个示例。 - Nate Kohl

3

您可以这样做,而不需要显式循环:

string s = "Bob Accountant 65 retired";
vector<string> vs;
istringstream iss(s);
copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(vs));

std::copy函数从第三行创建的字符串流中读取所有内容,并将其推送到第二行创建的向量中。

这里有一个在Ideone上的演示


1

从表面上看,您正在尝试从字符串中读取逻辑记录。为此,我会这样做:

struct record { 
    std::string name;
    std::string position;
    int age;
    std::string status;
};

std::istream &operator>>(std::istream &is, record &r) { 
    return i >> r.name >> r.position >> r.age >> r.status;
}

这使您能够从指定字段的记录中读取数据,使用stringstream到record。此外,它还可以让您从其他类型的流(例如,使用fstream从文件中)读取记录对象。请注意,HTML标记应保留,但不应包括解释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接