无法使用 `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);
行没有按照您的预期进行。它将输入视为字符,而不是数字。因此,如果您按 5 和 Enter,提取的值将为 53(字符 5
的 ASCII 代码)。相反,做 std::cin >> text_length;
.
此外,text_length
应该声明为 std::streamsize
,而不是 char
。如果它应该适合 8 位,则在进一步处理之前将值钳位。
还有其他错误:您没有以 null 终止您的缓冲区,并且您从未显式 delete
由 new
动态分配的内存(尽管它会在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可以让你终止输入。)
我正在尝试使用 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);
行没有按照您的预期进行。它将输入视为字符,而不是数字。因此,如果您按 5 和 Enter,提取的值将为 53(字符 5
的 ASCII 代码)。相反,做 std::cin >> text_length;
.
此外,text_length
应该声明为 std::streamsize
,而不是 char
。如果它应该适合 8 位,则在进一步处理之前将值钳位。
还有其他错误:您没有以 null 终止您的缓冲区,并且您从未显式 delete
由 new
动态分配的内存(尽管它会在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可以让你终止输入。)