C++ cin.getline() 不能在循环中工作

c++ cin.getline() does not work in loop

本文关键字:循环 工作 不能 cin getline C++      更新时间:2023-10-16

如果输入少于 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,'');,但它不起作用:S

您的问题是,当 getline 找到的字符数超过最大设置的字符数时,流的错误标志会被设置。(请参阅std::basic_istream:getline中的说明

计数-1 字符已被提取(在这种情况下,执行 setstate(failbit)。

如果

函数不提取任何字符(例如,如果计数<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]='';

        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:

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

它说getline将从流中读取字符

直到发生以下任何情况(按显示的顺序进行测试):

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

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

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

您将遇到最后一个条件,因此将设置故障位。设置后,您将无法继续,直到您通过调用 clear 清除错误条件。

另请注意,您不需要以现在的方式检查返回字符串的长度。您只需检查故障位即可确定是否超出了缓冲区。

最后请注意,您可以使用 gcount() 找出实际读取了多少个字符