我使用getline方法获取用户输入,但遇到了问题,我的代码类似于:
string messageVar;
cout << "Type your message: ";
getline(cin, messageVar);
然而,它并没有停止获取输出值,这是怎么回事?
cin >> something
之后,你要使用getline()
,则需要在两者之间清除缓冲区中的换行符。你可以使用cin.ignore()
来完成此操作。string messageVar;
cout << "Type your message: ";
cin.ignore();
getline(cin, messageVar);
>>
运算符在输入缓冲区中留下了一个换行符 \n
。当您进行未格式化的输入,例如使用 getline()
读取输入直到找到换行符时,这可能会成为问题。如果发生这种情况,它会立即停止读取,因为在您之前的操作中留下了那个悬挂的 \n
。std::cin.ignore();
这将很好地工作。它从输入中读取并丢弃下一个字符。
但是,如果您在输入中还有其他内容(除了换行符之外,例如,您读取了一个单词,但用户输入了两个单词),则必须执行以下操作:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
参见例如此ignore
函数的参考文献。
为了更加安全,使用第二种替代方法,并在循环中执行,直到gcount
返回零。
我有类似的问题。唯一的缺点是,使用cin.ignore()
时,您需要再按一次回车键,这会影响程序。
int main(){
.... example with file
//input is a file
if(input.is_open()){
cin.ignore(1,'\n'); //it ignores everything after new line
cin.getline(buffer,255); // save it in buffer
input<<buffer; //save it in input(it's a file)
input.close();
}
}
我知道我来晚了,但希望这对你有用。 逻辑是针对用户想要输入多行的情况,一次只处理一行。
int main()
{
int t; // no of lines user wants to enter
cin>>t;
string str;
cin.ignore(); // for clearing newline in cin
while(t--)
{
getline(cin,str); // accepting one line, getline is teminated when newline is found
cout<<str<<endl;
}
return 0;
}
输入:
3
贝汉普尔政府学院
谢拉姆普尔纺织学院
贝汉普尔谢拉姆普尔
输出:
贝汉普尔政府学院
谢拉姆普尔纺织学院
贝汉普尔谢拉姆普尔
getchar();
main ()
{
std::string name;
std::cout << "Please, enter your full name: ";
std::getline (std::cin,name);
std::cout << "Hello, " << name << "!\n";
return 0;
}
'\n'
。 - jrok