




std::cin >> 读不到空格后内容因以空白符为分隔;混用 >> 和 getline 时残留换行符会导致 getline 立即返回空行,需用 cin.ignore 清除。
std::cin >> 读不到空格后的部分因为 operator>> 默认以空白符(空格、制表符、换行)为分隔,遇到第一个空格就停了。比如输入 "Hello World",std::cin >> str 只拿到 "Hello","World" 还留在输入缓冲区里,后续读取可能出错。
std::getline() 的基本用法和常见陷阱用 std::getline() 才能真正读取一整行,包括空格,直到遇到换行符为止。但必须注意:它和 std::cin >> 混用时,缓冲区里残留的换行符会导致 getline() 立即返回空字符串。
std::cin >> 读数字或单词后,紧接着调 std::getline(std::cin, str) → 极大概率读到空行getli
ne() 前加 std::cin.ignore() 清掉残留换行符,例如 std::cin.ignore(1, '\n') 或更稳妥的 std::cin.ignore(std::numeric_limits<:streamsize>::max(), '\n')
std::getline() 第二个参数是 std::string&,不是 char*,别传 C 风格数组如果输入格式是“先一个整数 n,然后 n 行带空格的字符串”,典型错误是:
int n;
std::cin >> n;
std::string s;
for (int i = 0; i < n; ++i) {
std::getline(std::cin, s); // 这里第一轮几乎总是读到空行
}
正确写法:
n 后立刻调 std::cin.ignore()
getline() 读,再用 std::stoi() 解析第一行的数字"\r\n",Linux/macOS 是 "\n",getline() 自动处理,不用手动 strip '\r'(除非你从文件读且文件是 Windows 格式又没用文本模式打开)std::getline() 内部会动态扩容 std::string,一般没问题。但若预期单行可能上百 MB,得小心:
std::bad_alloc
std::getline() 读无换行的大文件块;改用 std::istream::read() 或分块 get()
std::cin.ignore(..., '\n') 比 getline() + 丢弃更省内存真正容易被忽略的是:混用 >> 和 getline() 时那个看不见的换行符——它不报错,只让程序逻辑静默失效。