为什么这个涉及 cin 的代码即使使用 cin.ignore() 也会跳过 getline
Why does this code involving cin skip getline even with cin.ignore()?
以下代码按预期工作前两个 getline 并在您输入 CC 变量后进入无限循环,跳过 getlines 而不等待输入。
下面是一个运行示例:
输入持卡人姓名(或退出):约翰·多伊
输入抄送号码: 1234 1234 1234 1555
代码输出其他 cout,但不等待 getline 的输入。 并重申 cout 语句。 cin.ignore 似乎没有帮助或 cin.clear()
法典:
int main(int argc, char* argv[]) {
char CCName[64]; //cardholder name
char CCNumber[16]; //credit card number
char Expiration[8]; //expiration date
float Amount;
while (true) {
/* input processing block */
//gather card holder name
cout << "nEnter card holder name (or quit): ";
cin.getline(CCName, 64);
//quit command processing
if (strcmp(CCName, "quit") == 1) {
cout << "nYou successfully terminated the programn";
//~ close(sockfd); //close socket
exit(EXIT_SUCCESS);
}
//gather credit card number
cout << "nEnter CC number: ";
cin.getline(CCNumber, 16);
//error checking
if (strlen(CCNumber) != 15 && strlen(CCNumber) != 16) {
cout << "nCredit card number must be 15 to 16 digits, try again: ";
cin.getline(CCNumber,16);
}
//gather expiration date
cout << "nEnter expiration: ";
cin.ignore();
cin.getline(Expiration, 7);
//error checking
if (strlen(Expiration) != 7) {
cout << "nExpiration date format mm/yyyy. Try again: ";
cin.getline(Expiration, 7);
}
//gather amount
cout << "nEnter amount: ";
cin >> Amount;
}
return 0;
}
你的问题是你给它更多的字符,而不是CCNumber可以容纳的字符
当你这样做时
1234 1234 1234 1555
由于您的输入实际上是 19 个字符(空格计数)而不是 16,这会在 CIN 中留下额外的字符,从而导致奇怪的行为。我修改了它做
cout << "nEnter CC number: ";
cin.ignore();
cin.getline(CCNumber, 16);
带输入
1234123412341234
这部分奏效了。 如果需要空格,请增加数组的大小。同样如前所述,这不是很安全,因为您假设用户会为您提供完美的数据。一个非常危险的假设。
使用 cin.getline() 是非常危险的。 cin.getline() 从键盘读取输入,然后当它读取换行符(当用户按回车键时生成)时,它会用空字符替换换行符。看看这会如何导致错误?更重要的是,您需要担心输入的大小,这只会施加太多限制,使其不太用户友好。我建议改用getline(cin,stringName)。
我对代码有一些建议,1.增加字符数组的大小
char CCName[65]; //cardholder name
char CCNumber[17]; //credit card number
2. 更正 if 条件
if (strcmp(CCName, "quit") == 0) {
3. 更改此设置
if (strlen(CCNumber) != 15 && strlen(CCNumber) != 16) {
通过这个
while (strlen(CCNumber) != 15 && strlen(CCNumber) != 16) {
4.关于日期输入,您可以编写一个单独的函数来检查其有效性。
相关文章:
- 而循环跳过 cin.getline() 对于 C 字符串
- 重用字符数组和 cin.getline
- 如果用户输入的输入大于 char 数组,则 cin.getline 会跳过输入提醒
- 必须使用 cin.getline() 按回车键两次
- 填充字符数组的最佳方法(获取与cin.getline)
- 递归 cin.getline() 不想要求输入
- 如何阻止 cin.getline() 导致控制台在找不到分隔符时重复获取用户输入?
- 我在使用 cin.getline() 从用户那里获取 3 个字符串并使用指针数组来存储它们时遇到问题
- cin.getline() 不适用于 switch 语句
- C++ 在 switch 语句中,cin.getline 不会分配给 c 字符串变量
- cin.getline() 等待输入
- 为什么cin.getline分配给字符数组,但使用'='不会?
- cin.getline(),而不使用字符串大小
- cin.getline 不使用 switch 语句
- cin.getline()函数在CIN之后无法正常工作
- Cin.Getline(char,int)在循环中被跳过
- C++ cin.getline 只读取一个字符
- CIN / Getline在控制台应用程序中的一行中
- cin.getline()的奇怪行为
- cin.getline()未按预期工作