使用find和substr从我的输出中删除逗号

时间:2013-10-01 00:00:26

标签: c++

我向我的导师发送了关于我的cin.ignore的帮助,这是她给我回复的信息。问题是,当你在最后阅读时 - 它包括逗号。所以你的cin.ignore需要2个参数,100,\ n。在这种情况下,您不需要cin.ignore。先读入然后再读到中间。然后使用字符串函数“查找”逗号并从最后一个位置0开始到逗号前面的位置创建一个子字符串。问题是我不知道她在说什么。我知道如何放入查找功能,但第二部分我没有得到。所以我把我的程序中的find和substr明显不起作用

#include <iostream>
#include <string>

using namespace std;

char chr;
int main()
{
    string last, first, middle;

    cout << "Enter in this format your Last name comma First name Middle name.    " << endl;
    // Input full name in required format
    last.find(",");
    last.substr(0);
    cin >> last;

    // receiving the input Last name 
    cin >> first;
    // receiving the input First name
    cin >> middle;
    // receiving the input Middle name
    cout << first << " " << middle << " " << last;
    // Displaying the inputed information in the format First Middle Last name

    cin >> chr;

    return 0;
}

3 个答案:

答案 0 :(得分:1)

你似乎在这里有一些基本的误解。

last.find(",");last.substr(0);都不会自行执行任何操作。它们都返回一个结果,但是如果你没有将它分配给任何东西,那么结果就会丢失。而且,substr有两个参数。如果省略第二个,last.substr(0)将只返回last的所有内容。

教练的意思可能是last = last.substr( 0, last.find(",") );。请注意,在从cin读取字符串后,必须发生。我们将这个陈述区分开来:

  • last.find(",")将返回逗号
  • 的位置
  • last.substr( 0, last.find(",") )是逗号
  • 之前last的一部分
  • 最后,作业last = ...将确保last实际上已更改。

请注意,这仅在逗号直接附加到姓氏时有效(如"Miller, John Henry"中所示)。

答案 1 :(得分:0)

好的,我认为这就是你想要的:

#include <iostream>
#include <string>
#include <vector>
#include <boost/algorithm/string.hpp>

using namespace std;

int main()
{
    // Read a line from stdin
    string line;
    getline(cin, line);

    vector<string> str_vec;                                                                                                                                                          
    boost::split(str_vec, line, boost::is_any_of(" ,"));
    if (str_vec.size() == 3) {
        string last = str_vec[0];
        string first = str_vec[1];
        string middle = str_vec[2];
        std::cout << "First=" << first << " Last=" << last << " Middle=" << middle << endl;
    }
}

如果您不想使用(或没有)boost库,则可以检查以下版本。注释应该有助于您理解代码的每个块。

#include <iostream>                                                                                                                                                                  
#include <string>

using namespace std;

int main()
{
    // Read a line from stdin
    string line;
    getline(cin, line);

    // Erase all commas
    while (true) {
        size_t comma_pos = line.find(",");
        if (comma_pos != std::string::npos) {
            line.erase(comma_pos, 1);
            line.insert(comma_pos, " ");
        }
        else break;
    }

    // Change all two spaces to only one space
    while (true) {
        size_t space_pos = line.find("  ");
        if (space_pos != std::string::npos)
            line.erase(space_pos, 2);
        else break;
    }

    // Tokenize the names
    size_t end_last_pos = line.find(" ");
    if (end_last_pos == string::npos) {
        cout << "Missing last name" << endl;
        return 1;
    }
    string last = line.substr(0, end_last_pos);

    size_t end_first_pos = line.find(" ", end_last_pos + 1);
    if (end_first_pos == string::npos) {
        cout << "Missing first name" << endl;
        return 1;
    }
    string first = line.substr(end_last_pos + 1, end_first_pos - end_last_pos - 1);

    size_t end_middle_pos = line.find(" ", end_first_pos + 1);
    string middle;
    if (end_middle_pos == string::npos)
        middle = line.substr(end_first_pos + 1);
    else
        middle = line.substr(end_first_pos + 1, end_middle_pos - end_first_pos - 1);

    // Print the names
    std::cout << "First='" << first << "' Last='" << last << "' Middle='" << middle << "'" << endl;
}

答案 2 :(得分:-3)

也许你可以尝试把你的

last.find(",");
last.substr(0);

在你的cin之后?