我向我的导师发送了关于我的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;
}
答案 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之后?