【问题标题】:Why does this code involving cin skip getline even with cin.ignore()?为什么这个涉及 cin 的代码即使使用 cin.ignore() 也会跳过 getline?
【发布时间】:2013-11-24 01:42:47
【问题描述】:

以下代码按预期用于前两个 getlines,在您输入 CC 变量后,它会进入无限循环,跳过 getlines 并且不等待输入。

这是一个示例运行:

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

输入抄送号码:1234 1234 1234 1555

// 代码输出其他 couts 但不等待 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 program\n";
            //~ 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;
}

【问题讨论】:

  • 您的字符数组必须为 17 个字符长。由于终止字符,您忘记了需要再添加 1 个字符。
  • 我建议您使用将std::string 作为第二个参数的std::getline 重载。它消除了控制输入大小的需要,并提供了对存储在字符串中的内存的自动管理(而不是必须手动处理数组)

标签: c++ loops input cin


【解决方案1】:

你的问题是你给它的字符多于 CCNumber 可以容纳的字符

当你这样做时

1234 1234 1234 1555 

作为您的输入,实际上是 19 个字符(空格数)而不是 16 个,这会在 cin 中留下额外的字符,这会导致奇怪的行为。我将其修改为

    cout << "\nEnter CC number: ";
    cin.ignore();
    cin.getline(CCNumber, 16);

有输入

1234123412341234

那部分奏效了。如果你想要空格增加数组的大小。 同样正如已经指出的那样,这不是很安全,因为您假设用户将为您提供完美的数据。一个非常危险的假设。

【讨论】:

    【解决方案2】:

    使用 cin.getline() 非常危险。 cin.getline() 从键盘读取输入,然后当它读取换行符(当用户按下回车键时生成)时,它将换行符替换为空字符。看看这将如何导致错误? 更重要的是,您需要担心输入的大小,这只会带来太多的限制,从而降低用户友好性。我建议改用 getline(cin,stringName)。

    【讨论】:

      【解决方案3】:

      我对代码有一些建议, 1.增加char数组的大小

      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。关于日期输入,您可以编写一个单独的函数来检查其有效性。

      【讨论】:

        猜你喜欢
        • 2014-11-28
        • 2012-08-24
        • 2014-03-08
        • 1970-01-01
        • 2018-05-10
        • 2018-08-13
        • 1970-01-01
        • 2014-04-01
        • 2020-09-14
        相关资源
        最近更新 更多