3

我向我的导师发送了关于我的 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;
}
4

3 回答 3

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")。

于 2013-10-01T00:20:53.287 回答
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;
}
于 2013-10-01T00:12:34.597 回答
-3

也许你可以尝试把你的

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

在你的 cin 之后?

于 2013-10-01T00:08:33.967 回答