如何用std::cin读取带空格的std::string直至指定分隔符?
针对std::string读取到指定分隔符的解决方案
嘿,这个问题其实很好解决——你完全可以用std::getline来处理std::string类型,它专门有适配std::string的重载版本,比你想的更顺手!
默认的std::cin >> destination确实会在空白字符(空格、换行、制表符这类)处停止读取,但std::getline支持自定义分隔符,完美匹配你“读取到指定分隔符为止”的需求。
基础用法示例
直接调用带三个参数的std::getline:输入流、目标string、你指定的分隔符:
#include <iostream> #include <string> int main() { std::string destination; const char delimiter = '|'; // 这里用竖线作为示例分隔符,你可以换成任意字符 // 从cin读取,直到遇到分隔符为止,分隔符会被丢弃,不会存入destination std::getline(std::cin, destination, delimiter); std::cout << "读取到的内容:" << destination << std::endl; return 0; }
如果不指定第三个参数,std::getline默认会以换行符'\n'作为分隔符,也就是读取一整行内容。
注意:处理输入缓冲区残留的问题
如果你在调用std::getline之前用过std::cin >>这类操作,要特别注意:cin >>会把输入后的换行符留在输入缓冲区里,这时候紧接着调用std::getline会直接读取到这个换行符,导致得到空字符串。
解决办法是在std::getline之前,用std::cin.ignore()清空缓冲区里的残留字符:
#include <iostream> #include <string> #include <limits> // 需要包含这个头文件来使用std::numeric_limits int main() { std::string temp; std::cin >> temp; // 假设之前有这样的读取操作 // 忽略缓冲区里所有字符,直到遇到换行符(包括换行符本身) std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::string destination; std::getline(std::cin, destination, ','); // 现在就能正常读取到逗号分隔的内容了 std::cout << "读取到的内容:" << destination << std::endl; return 0; }
为什么这是最佳选择?
相比char[]版本的用法,针对std::string的std::getline不需要你提前考虑数组的长度,它会自动根据读取的内容调整string的大小,避免缓冲区溢出的风险,用起来更安全省心。
内容的提问来源于stack exchange,提问作者Eduard Rostomyan
相关产品推荐
相关产品推荐

