无法使用 `std::cin.read` 读取:return 键无法识别

Cannot read with `std::cin.read`: return key not recognized

我正在尝试使用 std::cin.read() 函数从键盘读取字符串。 发生的事情是,当我键入字符串时,它看起来正在被读取,但是 [Return] 字符被视为普通的换行符,而不是终止符。

这个函数的终止符是什么?可以修改吗?

#include <iostream>

char* text;
char text_length = 0;

int main() {

    std::cout << "Text length: ";
    std::cin.get(text_length);
    std::cout << "\nText length: " << text_length << std::endl;

    text = new char[1024];
    std::cout << "\n\nText: ";
    std::cin.read(text, text_length);
    std::cout << "\n\nText: " << text << std::endl;
    
    return 0;
}

代码测试:GCC 11,clang 13。OS:Linux。

在 Windows 控制台上,EOF 指示器是 Ctrl+Z(不是 Ctrl+C,它将改为调用信号处理程序例程,默认情况下将调用 ExitProcess)。但是 Ctrl+Z on Windows 的问题是它必须是单独一行的第一个字符(即,你必须按 Enter 然后 Ctrl+Z,否则 Ctrl+Z 不会被识别为 EOF)。这意味着换行符也会在 EOF 之前被读取。

std::cin.get(text_length); 行没有按照您的预期进行。它将输入视为字符,而不是数字。因此,如果您按 5Enter,提取的值将为 53(字符 5 的 ASCII 代码)。相反,做 std::cin >> text_length;.

此外,text_length 应该声明为 std::streamsize,而不是 char。如果它应该适合 8 位,则在进一步处理之前将值钳位。

还有其他错误:您没有以 null 终止您的缓冲区,并且您从未显式 deletenew 动态分配的内存(尽管它会在OS当然会结束这个过程。

总结一下,查看这段代码:

#include <algorithm>
#include <iostream>
#include <limits>

int main()
{
    constexpr std::streamsize min_text_length{ 0 };
    constexpr std::streamsize max_text_length{ 255 };

    char* text{ nullptr };
    std::streamsize text_length{ 0 };

    std::cout << "Enter text length: ";
    std::cin >> text_length;
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::cout << "Text length entered: " << text_length << '\n';

    text_length = std::clamp(text_length, min_text_length, max_text_length);
    std::cout << "Text length to be used: " << text_length << '\n';

    text = new char[max_text_length + 1]{}; // Note this zero-fills the buffer
    std::cout << "Enter text: ";
    std::cin.read(text, text_length);
    std::cout << "Text entered BEGINS-->" << text << "<--ENDS\n";

    delete[] text;
}

输入长度后,输入一些文字,完成后按Enter,然后按Ctrl+ Z,然后再次输入。 (如前所述,不幸的是,Ctrl+Z 之前的换行符也会被读入,但至少 Ctrl+Z可以让你终止输入。)