c++第一个字符输入被忽略



我遇到了一个问题,我想输入字符串数组的元素,但除了第一个元素之外的所有元素都忽略了第一个字母。例如,我输入pepperoni, olvies, cheese,它将输出pepperoni, lives, heese。如果你看一下我的代码,我认为这是因为cin.ignore()出现在输入name之前。

cin.ignore();
getline(cin, name);
petes.setCustomerName(name);
for (int i = 0; i < numToppings; i++)
{
cin.ignore();
getline(cin, toppingNames[i]);
}

在第一个cin之前必须有一个cin.ignore

要记住一个简单的技巧,总是使用cin。忽略任何后面的字符>>any_variable在你的代码中使用。

cin存储"Enter"(即。输入流中的'n'字符)值。由于输入流中的这个字符,如果您在代码中的cin之后的任何地方使用像getline这样的命令,那么您的getline将被忽略。

例如,在您的例子中,第一个getline(cin, name)被忽略,因为您之前可能使用过cin。

然而,在使用cin.ignore时有一个问题。虽然在cin语句之后使用它确实会对您有很大帮助,但如果使用不当,它也会非常烦人。

考虑这样一种情况:您没有使用cin语句,并且代码中的第一个语句是getline。现在,如果你使用cin。忽略getline语句前的。Ignore将等待输入一个字符,将其从输入流中删除,然后执行剩余的代码。

这是因为在这种情况下,输入流中没有存储'n'字符,因此输入流为空。因此,cin。忽略在继续之前等待输入一个字符。

例如,考虑以下代码:
int main() 
{
string var; 
cin.ignore(); 
getline(cin, var); 
}

假设您输入"David"对于你的"变量"输入。现在,既然在中国的时候。忽略,输入流中没有我很高兴。忽略等待一个角色的到来。当按下D键时,cin。ignore从输入流中删除D,然后继续。现在,avid将被带入输入流,只要按下Enter键('n'), getline将存储"avid"在你的"变量"中变量,最终给出不正确的结果。

考虑相同的示例,但前面有一个cin语句,

int main()
{
int a;
string var;
cin >> a; 
cin.ignore();
getline(cin, var); 
}

在这种情况下,当语句,它将在输入流中存储'n'字符。现在,cin。Ignore将注意到输入流中的'n'字符,因此它将删除该字符并继续执行。现在,如果你输入大卫然后按回车键,你的完整单词"大卫";将存储在"变量"因为cin。ignore忽略cin语句存储的'n'字符,并且不会干扰您的' David"字符串。

但是,假设您不使用cin.ignore()语句做同样的操作,

int main()
{
int a;
string var;
cin >> a; 
// cin.ignore();
getline(cin, var); 
}

和往常一样,页>>语句将在输入流中存储一个'n'字符。然后它将继续进行。这里没有cin。在本例中忽略它,因此它将直接移动到getline.

getline语句会注意到输入流中的'n',因此它会认为用户已经输入了他的输入,并将输入流中的任何内容存储在变量&;var&;中。输入流中除了'n'字符之外没有任何内容,因此var变量将为空

这就是为什么你应该使用cin.ignore()的原因,但它应该始终小心使用。

继续你的例子,你的name变量被忽略了,因为一定有一个"n"字符存储在输入流中,因此,getline假定您已经输入了您的输入。使用cin。忽略在这种情况下是必要的。

但是,在该命令之后,没有cin语句,因此输入流为空。但是在for循环中,你再次使用了cin。在使用getline语句接受输入之前忽略。由于输入流是空的,所以cin。Ignore总是忽略你输入的任何内容的第一个字符,然后将剩余的输入存储在你使用getline使用的变量中。

只是为了小心避免这个错误,使用cin总是好的。在cin语句之后忽略,而不是在getline语句之前使用。这样,您就可以轻松地忽略cin和cin存储的'n'。Ignore也不会干扰getline语句(如果在getline语句之前使用它,可能会出现这种情况)

最新更新