用空格分隔字符串的最简单方法?

时间:2013-09-30 02:10:24

标签: c++ string

自从我使用C ++已经很长时间了,在我的空闲时间使用Javascript,现在我不确定我记得的是什么。

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

我看到的所有链接都是自制功能,但我可以发誓有一种方法可以使用标准库通过使用流来实现它,但同样,我很难回忆起它和我的谷歌搜索结果也没有帮助。

请记住,它不是我正在使用的流,它只是一个像“Bob Accountant 65 retired”这样的字符串,我必须将字符串中的每个项目提取到自己的数据字段。我一直在搞乱ifstreams和ofstreams但是我甚至不确定我在做什么,忘记了它的语法。

3 个答案:

答案 0 :(得分: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关于重载流{{1}的优秀建议}对于您的数据类型:

operator>>

答案 1 :(得分: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从第三行创建的字符串流中读取所有内容,并将其推送到第二行创建的向量中。

这是demo on ideone

答案 2 :(得分: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;
}

这使您可以从指定字段的stringstreamrecord读取数据。顺便提一下,它也允许您从其他类型的流中读取record个对象(例如,使用fstream从文件中读取)。