1

可能重复:
在 C++ 中拆分字符串

我正在为我的 C++ 课做作业,我希望能得到一些帮助。我在使用 C++ 编码时遇到的最大问题之一是解析字符串。我找到了解析字符串的更长更复杂的方法,但是我需要编写一个非常简单的程序,只需将字符串解析为 2 个部分:一个命令和一个数据部分。例如:Insert 25这会将其拆分为 Insert 和 25。

我计划使用字符串数组来存储数据,因为我知道它只会将字符串分成 2 个部分。但是,我还需要能够读取不需要解析的字符串,例如Quit

在不使用诸如 boost 之类的外部库的情况下完成此任务的最简单方法是什么?

4

4 回答 4

2

简单的可能是这样的:

string s;
int i;

cin >> s;
if (s == "Insert")
{
    cin >> i;
    ... // do stuff
}
else if (s == "Quit")
{
    exit(0);
}
else
{
    cout << "No good\n";
}

如果您需要很好地处理用户错误、可扩展性等,最简单的方法可能不太好。

于 2012-10-21T20:11:46.647 回答
1

您可以使用 , 从流中读取字符串getline,然后通过查找' '字符串中空格字符的第一个位置并使用该substr函数两次(对于空格左侧的命令和右侧的数据)来进行拆分空间)。

while (cin) {
     string line;
     getline(cin, line);
     size_t pos = line.find(' ');
     string cmd, data;
     if (pos != string::npos) {
         cmd = line.substr(0, pos-1);
         data = line.substr(pos+1);
     } else {
         cmd = line;
     }
     cerr << "'" << cmd << "' - '" << data << "'" << endl;
}

这是ideone 上演示的链接

于 2012-10-21T20:15:00.573 回答
1

这是另一种方式:

string s("Insert 25");
istringstream iss(s);
do
{
   string command; int value;
   iss >> command >> value;
   cout << "Values: " << command << " " << values << endl;
} while (iss);
于 2012-10-21T20:15:25.560 回答
0

我喜欢将流用于此类事情。

int main()
{
    int Value;
    std::string Identifier;
    std::stringstream ss;
    std::multimap<std::string, int> MyCollection; 

    ss << "Value 25\nValue 23\nValue 19";

    while(ss.good())
    {
            ss >> Identifier;
            ss >> Value;
            MyCollection.insert(std::pair<std::string, int>(Identifier, Value));
    }

    for(std::multimap<std::string, int>::iterator it = MyCollection.begin(); it != MyCollection.end(); it++)
    {
            std::cout << it->first << std::endl;
            std::cout << it->second << std::endl;
    }

    std::cin.get();
    return 0;
}

这样您就可以将数据转换为所需的格式。并且流会自动在空格上拆分。如果您使用文件,它与 std::fstream 的工作方式相同。

于 2012-10-21T20:58:19.927 回答