c ++ cin.getline()在循环中不起作用

时间:2015-03-12 05:46:25

标签: c++

如果输入小于128个字符,我没有问题。 但是如果输入超过128个字符,则循环会一直传递,我会收到垃圾邮件:错误:您必须键入内容。 在关闭控制台并完成程序之前,我无法做某事。

似乎没有调用cin.getline()函数,命令变量总是为空。

我的计划是,命令太长了,我想要一个新的输入......

问题出在哪里???

...

#define MAX_COMMAND_LENGTH 128


int main()
{
    char command[MAX_COMMAND_LENGTH];

    while (1)
    {
        cout << "\nSend command: ";

        cin.getline(command, MAX_COMMAND_LENGTH);


        if ((strlen(command) == 0))
        {
            cout << "ERROR: You must type something." << endl;
            continue;
        }
        else if (strlen(command) > MAX_COMMAND_LENGTH - 2)
        {
            cout << "ERROR: The command may only be 128 characters long." << endl;
            continue;
        }

        ...
    }
    return 0;
}

我也尝试过:cin.ignore(MAX_COMMAND_LENGTH,'\ n');,但它不起作用:S

2 个答案:

答案 0 :(得分:0)

您的问题是,当getline找到的字符多于最大值时,会设置流的错误标记。 (请参阅std::basic_istream::getline

上的说明
  

已提取count-1个字符(在这种情况下执行setstate(failbit))。

  

如果函数没有提取字符(例如,如果count <1),则执行setstate(failbit)。

以下对我有用: (抱歉,将最大值更改为10 ...保存了一些打字)

#define MAX_COMMAND_LENGTH 10
#include <iostream>
#include <cstring>


using namespace std;


int main()
{
    char command[MAX_COMMAND_LENGTH+1];

    while (1)
    {
        cout << "\nSend command: ";

        cin.getline(command, MAX_COMMAND_LENGTH);
        command[MAX_COMMAND_LENGTH]='\0';


        if ((strlen(command) == 0))
        {
            cout << "ERROR: You must type something." << endl;
            cin.clear(); // <--- reset the flags
            continue;
        }
        else if (strlen(command) > MAX_COMMAND_LENGTH - 2)
        {
            cout << "ERROR: The command may only be 10 characters long." << endl;
            cin.clear(); // <--- reset the flags
            cin.ignore(MAX_COMMAND_LENGTH,'\n'); // <-- skip unred chars
            continue;
        }
        cout << "Command received is: " << command << endl;
    }
    return 0;
}

输出结果为:

Send command:
ERROR: You must type something.

Send command: 1
Command received is: 1

Send command: 12
Command received is: 12

Send command: 123
Command received is: 123

Send command: 12345678
Command received is: 12345678

Send command: 1234567890
ERROR: The command may only be 128 characters long.

Send command: 12345678901
ERROR: The command may only be 128 characters long.

Send command: 12345678
Command received is: 12345678

Send command: 1234
Command received is: 1234

Send command:

答案 1 :(得分:0)

您需要更仔细地阅读getline的文档。

它说getline将从流中读取字符

  

直到发生以下任何一种情况(按所示顺序测试):

     
      
  • 文件结束条件发生在输入序列中(在这种情况下   setstate(eofbit)执行)

  •   
  • 下一个可用的字符c是分隔符,由确定   特征:: eq(c,delim)。提取分隔符(不同于   basic_istream :: get())并计入gcount(),但未存储。

  •   
  • 已提取count-1个字符(在这种情况下)   setstate(failbit)被执行)。

  •   

您将达到最后一个条件,因此将设置failbit。设置完成后,您将无法继续操作,直到您通过调用clear清除错误情况为止。

另请注意,您不需要按照自己的方式检查返回字符串的长度。您只需要检查failbit以确定是否超出了缓冲区。

最后请注意,您可以使用gcount()

找出实际读取的字符数