使用std::cin.read读取输入时回车键不被识别为终止符问题咨询
关于std::cin.read()的终止符问题解答
核心问题答复
std::cin.read()属于无格式输入函数,没有默认的输入终止符:它的执行逻辑是严格按照传入的第二个参数(要读取的字节数)读取输入流中的内容,所有字符包括换行符、空格、制表符都会被当作普通字节处理,不会触发读取截断。只有两种情况会提前终止读取:- 已经读取到指定字节数的内容
- 输入流触发EOF(Linux下按Ctrl+D,Windows下按Ctrl+Z)或发生IO错误
- 不支持自定义
std::cin.read()的读取终止符:该函数的设计目标就是按字节数批量读取原始输入,没有提供终止符相关的自定义接口。如果需要按指定字符截断读取,应该使用专门的行读取函数:- 读取到C风格字符数组可以用
std::cin.getline(),默认终止符为换行符,支持传入第三个参数自定义终止符 - 读取到std::string可以用
std::getline(std::cin, str),同样支持自定义终止符
- 读取到C风格字符数组可以用
测试代码额外问题说明
你提供的测试代码本身存在逻辑偏差,会放大不符合预期的表现:
你定义了char text_length = 0,之后调用std::cin.get(text_length),这里get()方法接收char类型参数时,读取的是输入字符的ASCII编码值,而不是数值。比如你在终端输入数字10然后按回车,实际读入text_length的是字符'1'的ASCII值49,后续std::cin.read()会尝试读取49个字节,你输入时按下的换行只会被当作1个普通字节计入总读取量,自然不会触发读取终止。
#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; }
内容的提问来源于stack exchange,提问作者Pietro
相关产品推荐
相关产品推荐

