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

Why does this code involving cin skip getline even with cin.ignore()?

本文关键字:cin getline ignore 代码 为什么      更新时间:2023-10-16

以下代码按预期工作前两个 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.关于日期输入,您可以编写一个单独的函数来检查其有效性。