Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么涉及cin的代码即使使用cin.ignore()也会跳过getline?_C++_Loops_Input_Cin - Fatal编程技术网

C++ 为什么涉及cin的代码即使使用cin.ignore()也会跳过getline?

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];//持卡人姓名 字符

下面的代码与前两个getlines的预期工作方式相同,输入CC变量后,它进入一个无限循环,跳过getlines,不等待输入

以下是一个运行示例:

输入持卡人姓名(或退出):John Doe

输入抄送号码:1234 1234 1234 1555

//代码输出其他cout,但不等待getline的输入。并重申库特的声明。cin.ignore似乎没有帮助,或者cin.clear()

代码:

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