系统会提示用户"输入中间首字母";。如果他们输入空格、全名,或者后面跟着句点"."的字母,会发生什么?我们如何使用cin.ignore修改程序以处理此问题?这是我目前拥有的代码:我评论了我遇到麻烦的地方。
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string fname, lname;
char MI;
cout << "Please enter your first name: ";
cin >> fname;
cout << "Please enter your middle initial: ";
cin.ignore(1, 'n');
cin.get(MI);
cout << "Please enter your last name: ";
//cin.ignore('n')
cin >> lname;
cout << "Your name is " << fname << " " << MI << " " << lname << endl;
return 0;
}
当我有另一个cin.ignore时,它仍然什么都不做,姓氏读取额外的输入。我试着添加了一些要读取的字符,但仍然无法解决问题。当我运行它时,它只是跳过姓氏的输入。我还尝试将姓氏输入更改为getline,但仍然没有执行任何操作。
您只需使用std::getline
和std::istringstream
:
#include <iostream>
#include <string>
#include <sstream>
int main()
{
std::string fname, lname;
std::string MI;
std::cout << "Please enter your first name: ";
std::getline(std::cin, fname);
std::istringstream iss(fname);
iss >> fname;
do
{
std::cout << "Please enter your middle initial: ";
std::getline(std::cin, MI);
} while (MI.size() != 1);
std::cout << "Please enter your last name: ";
std::cin >> lname;
std::cout << "Your name is " << fname << " " << MI << " " << lname << std::endl;
return 0;
}
在这里,对于fname
,我使用std::getline
来获得用户输入,然后使用std::istringstream
只获得输入中的一个单词。
对于MI
,我将其设为字符串,直到用户不提供一个字符,程序才会继续。
并且lname
部分是相同的。
您应该更改:
cin.ignore(1, 'n');
cin.get(MI);
简单地说:
cin >> MI;
让operator>>
忽略名字和中间首字母之间的任何空白,包括换行符。
在阅读MI
之后,您可以使用以下内容忽略所有内容,直到下一个输入:
cin.ignore(numeric_limits<streamsize>::max(), 'n');
试试这个:
#include <iostream>
#include <string>
#include <limits>
using namespace std;
int main ()
{
string fname, lname;
char MI;
cout << "Please enter your first name: ";
cin >> fname;
cout << "Please enter your middle initial: ";
cin >> MI;
cin.ignore(numeric_limits<streamsize>::max(), 'n');
cout << "Please enter your last name: ";
cin >> lname;
cout << "Your name is " << fname << " " << MI << " " << lname << endl;
return 0;
}