2014-05-06 44 views
2

如果我不确定在getline之前是否会得到cin,我该如何摆脱领先的''和'\ n'符号?“cin”和“getline”问题的真正解决方案

例子:

int a; 
char s[1001]; 
if(rand() == 1){ 
    cin >> a; 
} 

cin.getline(s); 

如果我,则对getline前加上一个cin.ignore(),我可能会失去字符串的第一个符号,所以我把它的每一个使用“CIN后唯一的选择>>'?因为当你在一个大项目中工作时,这不是很有效的方法。

是否有比这更好的办法:

int a; 
string s; 

if(rand() == 1){ 
    cin >> a; 
} 

do getline(cin, s); while(s == ""); 
+0

不知道,没有看到您的具体投入,但可能这有助于HTTP: //stackoverflow.com/questions/23047052/why-does-reading-a-struct-record-fields-from-stdistream-fail-and-how-can-i-fi –

+0

不要混合'>>'和' getline'。只是总是使用'getline'。就目前而言,由于您不检查cin >> a'是否成功,因此您的代码无论如何都会中断。 –

回答

2

像这样:

std::string line, maybe_an_int; 

if (rand() == 1) 
{ 
    if (!(std::getline(std::cin, maybe_an_int)) 
    { 
     std::exit(EXIT_FAILURE); 
    } 
} 

if (!(std::getline(std::cin, line)) 
{ 
    std::exit(EXIT_FAILURE); 
} 

int a = std::stoi(maybe_an_int); // this may throw an exception 

您可以通过几种不同的方式解析字符串maybe_an_int。你也可以使用std::strtol,或字符串流(在相同条件下与第一if块):

std::istringstream iss(maybe_an_int); 
    int a; 
    if (!(iss >> a >> std::ws) || iss.get() != EOF) 
    { 
     std::exit(EXIT_FAILURE); 
    } 

你当然手柄解析错误的更优雅,例如通过在循环中运行整个事件直到用户输入有效数据。

0

标准IOStreams将空格字符和换行符都分类为空格。如果混合格式的I/O未格式化I/O,你需要清除残留空白的流,请使用std::ws机械手:

if (std::getline(std::cin >> std::ws, s) { 

}