我在使用 getline 方法获取用户键入的消息时遇到问题,我正在使用类似的东西:
string messageVar;
cout << "Type your message: ";
getline(cin, messageVar);
但是,它并没有停止获取输出值,这有什么问题?
如果您使用getline()
after cin >> something
,则需要将换行符从中间的缓冲区中清除。您可以使用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');
参见例如this reference of the ignore
function。
为了更安全,请在循环中执行上面的第二种选择,直到gcount
返回零。
我有类似的问题。一个缺点是cin.ignore()
,你必须再按回车键 1 次,这会使程序混乱。
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
政府拼贴画 Berhampore
Serampore 纺织拼贴画
Berhampore 塞兰波尔
输出:
政府拼贴画 Berhampore
Serampore 纺织拼贴画
Berhampore 塞兰波尔
我认为您没有在程序结束之前暂停程序,因此您在获得输入后放置的输出没有在屏幕上看到,对吗?
做:
getchar();
程序结束前
代码是正确的。问题一定出在其他地方。尝试 std::getline 文档中的简约示例。
main ()
{
std::string name;
std::cout << "Please, enter your full name: ";
std::getline (std::cin,name);
std::cout << "Hello, " << name << "!\n";
return 0;
}