2009-11-16 68 views
17

是否有一个原因,如果在我的计划,我要求用户输入的,而我做的事:需要用函数getline()帮助

int number; 
string str; 
int accountNumber; 

cout << "Enter number:"; 
cin >> number; 
cout << "Enter name:"; 
getline(cin, str); 
cout << "Enter account number:"; 
cin >> accountNumber; 

为什么输入第一个号码后,输出“输入名称” ,之后我甚至在输入getline(cin,str)行的“str”之前立即输入“Enter Account Number”?谢谢!

+0

可能重复[什么是我不理解有关函数getline +字符串?](http://stackoverflow.com/questions/8248239/what-am-i-not-understanding-about-getlinestrings) –

+0

可能[为什么std :: getline()跳过格式化后的输入提取?](http://stackoverflow.com/questions/21567291/why-does-stdgetline-skip-input-after-a-formatted-extraction) –

回答

3
cin >> number // eat the numeric characters 
getline(cin, str) // eat the remaining newline 
2
cin >> number 

只从缓冲区争夺的数字,它的叶子在缓冲区中,然后立即抓起通过,则对getline并解释为空字符串(或字符串只是新的“输入”线,我忘了)。

+1

cin >>数字,不是? – pmr

+0

是的,他打错了所有。 – Secko

+0

@Secko是的,那正是我想要沟通的东西。如果我显得粗鲁,我很抱歉。 – pmr

12

尝试

cout << "Enter name:"; 
cin.ignore(); 
getline(cin, str); 
1

我认为这个问题是在换行符(\n)cin >>通行证。 getline()假定换行符是空格并将其传递。有人发布了可以使用的解决方案。

您可以使用虚拟getline(cin, dummy);或真实的东西cin.ignore(100,'\n');

16

getline(cin, str);读取的次数后先前读取自带的换行,并立即与这个“线”返回。为了避免这种情况,你可以跳过空白与std::ws读取名前:

cout << "Enter number:"; 
cin >> number; 
cout << "Enter name:"; 
ws(cin); 
getline(cin, str); 
... 

注意,这也换行后跳过前导空白,所以str不会用空格开始,即使用户没有输入他们。但在这种情况下,这可能是一个功能,而不是一个bug ...

+0

请注意,此方法不允许用户输入空行。 – interjay

4

它看起来像你想要基于行的阅读。为此,您可能需要一致地使用getline,然后解析每行,如果您需要从读取行解析数字。它使输入读数更加一致。

这样,您不必手动扫描每一行的结尾,以确保下一次读取操作在新行上开始。

它还使得重复输入请求的添加错误处理更简单。

例如的

#include <string> 
#include <iostream> 
#include <istream> 
#include <ostream> 
#include <sstream> 

int parse_integer(const std::string& input) 
{ 
    std::istringstream iss(input); 
    int result; 
    if (!(iss >> result)) 
    { 
     // error - throw something? 
    } 
    return result; 
} 

int main() 
{ 
    int number; 
    std::string str; 
    int accountNumber; 

    std::string inputline; 

    std::cout << "Enter number: "; 

    if (!std::getline(std::cin, inputline)) 
    { 
     // error - throw something? 
    } 

    number = parse_integer(inputline); 

    std::cout << "Enter name:"; 

    if (!std::getline(std::cin, inputline)) 
    { 
     // error - throw something? 
    } 

    str = inputline; 

    std::cout << "Enter account number:"; 

    if (!std::getline(std::cin, inputline)) 
    { 
     // error - throw something? 
    } 

    accountNumber = parse_integer(inputline); 

    return 0; 
}