C++ 为什么涉及cin的代码即使使用cin.ignore()也会跳过getline?
下面的代码与前两个getlines的预期工作方式相同,输入CC变量后,它进入一个无限循环,跳过getlines,不等待输入 以下是一个运行示例: 输入持卡人姓名(或退出):John Doe 输入抄送号码:1234 1234 1234 1555 //代码输出其他cout,但不等待getline的输入。并重申库特的声明。cin.ignore似乎没有帮助,或者cin.clear() 代码:C++ 为什么涉及cin的代码即使使用cin.ignore()也会跳过getline?,c++,loops,input,cin,C++,Loops,Input,Cin,下面的代码与前两个getlines的预期工作方式相同,输入CC变量后,它进入一个无限循环,跳过getlines,不等待输入 以下是一个运行示例: 输入持卡人姓名(或退出):John Doe 输入抄送号码:1234 1234 1234 1555 //代码输出其他cout,但不等待getline的输入。并重申库特的声明。cin.ignore似乎没有帮助,或者cin.clear() 代码: intmain(intargc,char*argv[]){ char CCName[64];//持卡人姓名 字符
intmain(intargc,char*argv[]){
char CCName[64];//持卡人姓名
字符CCNumber[16];//信用卡号
字符过期[8];//过期日期
浮动金额;
while(true){
/*输入处理块*/
//收集持卡人姓名
cout使用cin.getline()非常危险。cin.getline()从键盘读取输入,然后当它读取换行符(用户按下enter键时生成)时,它将换行符替换为空字符。查看这将如何导致错误?
更重要的是,您需要担心输入的大小,这会带来太多的限制,从而降低用户友好性。我建议改用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.关于日期输入,您可以编写一个单独的函数来检查其有效性。您的问题是您给它的字符数超过了CCNumber所能容纳的字符数
当你这样做的时候
1234 1234 1234 1555
作为你的输入,它实际上是19个字符(空格计数),而不是16个,这在cin中留下了额外的字符,这导致了奇怪的行为
cout << "\nEnter CC number: ";
cin.ignore();
cin.getline(CCNumber, 16);
这一部分起作用了。如果你想让空格增加数组的大小。
另外,正如已经指出的,这不是很安全,因为您假设用户将为您提供完美的数据。这是一个非常危险的假设。您的字符数组必须是17个字符长。您忘记了由于终止字符,您需要再添加1个字符。我建议您使用std::getline
重载,该重载需要std::string
作为第二个参数。它消除了控制输入大小的需要,并提供了对存储在字符串中的内存的自动管理(而不必手动处理数组)
cout << "\nEnter CC number: ";
cin.ignore();
cin.getline(CCNumber, 16);
1234123412341234