cin.get() 的空输入到底意味着什么?

What exactly empty input means for cin.get()?

我认为这是一个简单的问题,但是我不理解这个代码示例中的概念,主要是在while循环中:

#include <iostream>

const int ArSize = 10;
void strcount(const char * str);

int main(){
    using namespace std;
    char input[ArSize];
    char next;


    cout << "Enter text:\n";
    cin.get(input, ArSize);
    while(cin){

        cin.get(next);
        while(next != '\n')
            cin.get(next)
        
        strcount(input);
        cout << "Enter next line, empty line ends the program:\n";
        cin.get(input, ArSize);
    }

    cout << "The end\n";
    return 0;
}

...

我的理解是 while 循环一直持续到 cin returns false。它过滤掉缓冲区中剩余的输入(因为它不是 ArSize 或以下的大小,或者它是 - 然后它只会过滤掉换行符)直到它遇到换行符。然后它计算字符串的字符(在这个问题中不重要),然后,假设有人只是按回车键。 cin.get() 丢弃输入中的换行符。因此,例如,如果某人在终端中输入了一个空文本行,它会将其读取为 'failed' 输入和 cin returns false?因为如果有人继续换行,只需按回车键,它只会将换行符留在缓冲区中,cin.get() 无法获取它,所以它 returns 为假。还是我错了?

简而言之 - 如果您直接按回车键,会发生什么? cin.get() 无法获取输入,因为缓冲区中只有换行符,它会将其视为输入失败,所以它 returns false?

如果 cin.get(input, ArSize); 没有读取任何字符(即它遇到的第一个字符是换行符),它会调用 setstate(failbit) 将流置于失败状态,因此 while(cin) 变为 false, 结束循环。

正如您从 CPP 参考资料中看到的那样 https://en.cppreference.com/w/cpp/io/basic_istream/get

cin。 get() 用于从键盘缓冲区读取下一个字符,它 returns 该字符以防它可以被读取, returns EOF 否则设置 failbit 和 eofbit (这使得表达式在if 语句的计算结果为 false)。

现在让我们逐行查看代码:

while(cin){

只要 cin 对象中的 failbit 标志设置为 goodbit,则此计算结果为真,不会显示任何错误。 (https://en.cppreference.com/w/cpp/io/ios_base/iostate)

 cin.get(next);
     while(next != '\n')
          cin.get(next)

第一行从键盘缓冲区中读取下一个字符并将其存储在 next 变量中,while 循环检查换行符,如果换行符不是下一个字符,则相当于按 Enter然后缓冲区继续读取并存储在 next 中,直到遇到换行符,然后退出循环返回到外部 while 循环。

strcount(input);
    cout << "Enter next line, empty line ends the program:\n";
    cin.get(input, ArSize);

然后我假设的strcount函数是用来统计用户在while循环之前通过这行代码在输入数组中输入的字符。

cin.get(input, ArSize);

然后在 while 循环的最后一行,程序读取用户的另一个输入。

请注意:

这里使用这三行是为了确保在换行符出现之前在每个循环中都读取每一行,即使字符数大于 ArSize 变量。当发生这种情况时,while 循环之前的第一行将从缓冲区中读取 ArSize 的数量,如果除换行符之外还有剩余字符,它将被三行读取,直到出现换行符,以便下一个获取函数将在前一个换行符之后开始查找缓冲区中的字符。

cin.get(next);
    while(next != '\n')
        cin.get(next)

如果有任何不清楚的地方请告诉我。