从字符串数组中提取字符串

时间:2014-12-10 10:05:18

标签: c++

我有一系列的字符串"最后一个"名。 在文件上我的名字写为:

安倍亚当斯。

John Adams。

John Doe。

莎拉史密斯。

我已将这些存储到字符串中,但没有句点。我想要做的是将名字和姓氏分成两个不同的字符串。这是我的代码,但它不起作用?我做错了什么?

{
 int n = MAX;

 for (int i = 0; i < n; i++){
     last[i] = substr(' ',',');


     for (int i = 0; i < n; i++){
        first[i] = getline(cin,x[i],' ');
     }

      return;
 }

2 个答案:

答案 0 :(得分:2)

假设您正在阅读stdin的输入,一种(微不足道)的方式是直接从cin读取如下:

std::vector<std::string> first_names, last_names;

while (std::cin)
{
    std::string first_name, last_name;
    std::cin >> first_name >> last_name;
    first_names.push_back(first_name);
    last_names.push_back(last_name);
}

这适用于输入的非常简单的格式,但任何更复杂的东西可能都不那么简单。作为一般规则,将输入中的每一行读入字符串并在那里进行处理会更好:

std::string line;
while (std::getline(std::cin, line))
{
    // Do some stuff here with 'line', e.g.
    size_t space_pos = line.find_first_of(' ');
    std::string first_name = line.substr(0, space_pos);
    std::string last_name = line.substr(space_pos + 1);
}

这将为您提供更多选项,例如使用字符串标记符或正则表达式模式匹配器根据更复杂的标准进行提取。

当然,如果您不是从stdin读取名称对,而是从数组或向量中读取,则可以简单地遍历集合并将line替换为迭代器的目标。

答案 1 :(得分:0)

您的代码中有一些错误:

  • 你缺少一个大括号
  • substr不会将char作为参数

你可以这样做:

    std::vector<std::string> fns, lns;
    std::string fn, ln;

    bool hasinput = true;
    std::string inp;

    while (hasinput)
    {
        std::getline(std::cin, inp);
        if (inp.empty())
        {
            hasinput = false;
            break;
        }
        else
        {
            fn, ln = inp;
            fns.push_back(fn);
            lns.push_back(fn);
        }
    }

不要忘记这些#include

#include <iostream>
#include <string>
#include <vector>