2014-10-03 94 views
0

本网站上有几个问题涉及getline无法正常工作,显而易见的解决方案是缓冲区中还有需要清除的换行符,据推测与cin.ignore()。我已经尝试过这么多的变化,没有什么似乎工作,所有我想要做的只是简单的控制台输入和cin >> string不是一个选项,因为字符串可能有空格。getline(cin,string)不工作即使有cin.ignore()

这是我的代码。

void prompt(std::string * str) 
{ 
    cout << "> "; 

    cin.sync(); 
    cin.get(); 
    cin.ignore(256, '\r'); 
    cin.ignore(256, '\n'); 
    cin.ignore(); 
    cin.ignore(); 

    std::string tmp; 
    getline(cin, tmp); 

    cin.sync(); 
    cin.get(); 
    cin.ignore(256, '\r'); 
    cin.ignore(256, '\n'); 

    *str = tmp; 
} 

正如你所看到的我已经尝试了各种各样的东西。它仍跳过getline(cin,tmp),似乎将str设置为空字符串。请帮忙。感谢您的时间。

+2

请不要标记C++与C标签问题 – 2014-10-03 19:49:48

+0

尝试删除所有'忽略()'命令,并使用'的std ::函数getline(给std :: cin> > std :: ws,tmp);'而是。 '>> std :: ws'跳过所有空格(包括行尾)。 – Galik 2014-10-03 19:50:30

+0

我没有看到任何错误检查。做'if(!cin){cout <<“某事设置了失败位。” << endl; }' – 2014-10-03 20:34:24

回答

0

不鼓励使用指针传递变量。如果你想从函数&推荐值。

我不知道你在调用prompt()的上下文,但这里有一个建议,可以实施prompt(),这可能对你更好。

#include <algorithm> 
#include <iostream> 
#include <string> 

// return bool so you know if it failed or not 
bool prompt(std::string& s) // use reference 
{ 
    std::cout << "> "; 
    return std::getline(std::cin >> std::ws, s); 
} 

int main() 
{ 
    char c; 
    std::string s; 

    do 
    { 
     if(!prompt(s)) // always check the imput 
      break; 

     // process the string (reverse it for example...) 
     std::reverse(s.begin(), s.end()); 
     std::cout << "reversed: " << s << '\n'; 

     std::cout << "Another go? [y/n]: "; 
    } 
    while(std::cin.get(c) && std::tolower(c) == 'y'); 
} 
1

一旦任何格式化的提取失败,失败位将在您的流上设置,并且未来的操作将不会执行任何操作。这样做比较方便,因为您可以处理组中的错误,而不必在每次操作之后进行检查。但是,一旦您检测到错误,您需要重置失败位以尝试不同的事情。做到这一点的命令很简单:

cin.reset(); 
+0

看起来''getline'调用正在设置失败位 – Jake 2014-10-06 02:37:19

+1

@Jake:所以在'getline'之前,'if(cin)cout <<“一切正常”<< endl;'并且在getline之后,if (!cin)cout <<“cin失败”<< endl;'都打印?你是否重定向来自文件的输入? 'getline'对输入格式不是很挑剔,我不能认为除了流结束之外,什么会导致它失败。 – 2014-10-06 02:41:05

+0

是的,那些都打印,我不知道你的意思,但我没有做任何事情(故意)与文件,只是试图读取控制台输入:\ – Jake 2014-10-06 03:01:48