C++中cin.get()读取含空格字符数组时输入异常的解决咨询
cin.get()读取含空格的字符串时程序提前终止 我编写了如下C++代码:
#define MAX 100 // 假设MAX是定义过的常量 int main(){ char str1[MAX], str2[MAX]; cout <<" 1st string: "; cin.get(str1, MAX); cout <<" 2nd string: "; cin.get(str2, MAX); cout << str1 << str2; return 0; }
我尝试为两个字符数组str1和str2输入包含空格的字符串,但程序在完成第一个输入后就终止了。输出界面显示:
1st string : abc def
当我按下回车准备输入第二个数组时,程序直接终止,仅显示第一个字符串,输出内容为:
2nd string abc def
请问如何正确使用cin.get()函数实现两次输入?是否有其他方法可以读取包含空格的字符数组?
嘿,这个问题我之前也踩过坑!核心原因是输入缓冲区里残留的换行符在搞鬼:
当你输入abc def然后按回车,cin.get(str1, MAX)会把换行符之前的所有字符(也就是abc def)读到str1里,但那个换行符\n还留在输入缓冲区里没被处理。接下来调用cin.get(str2, MAX)的时候,它一看到缓冲区里的换行符,就直接认为输入结束了,根本不会等你输入第二个字符串,所以str2是空的,程序直接跳去输出然后退出了。
下面给你几个靠谱的解决办法:
1. 手动清理缓冲区的换行符
在第一次cin.get()之后,用cin.ignore()把缓冲区里的换行符(以及可能残留的其他字符)清掉,这样第二次cin.get()就能正常接收输入了:
#define MAX 100 #include <iostream> #include <limits> // 要包含这个头文件使用numeric_limits int main(){ char str1[MAX], str2[MAX]; std::cout <<" 1st string: "; std::cin.get(str1, MAX); // 跳过缓冲区里直到换行的所有字符,确保缓冲区干净 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout <<" 2nd string: "; std::cin.get(str2, MAX); std::cout << str1 << "\n" << str2; return 0; }
要是不想加<limits>头文件,也可以直接写std::cin.ignore(1000, '\n'),只要数字足够大,能覆盖缓冲区里的残留字符就行。
2. 换用cin.getline()更省心
cin.getline()和cin.get()功能差不多,但它会自动把读取到的换行符从缓冲区里扔掉,不需要你手动清理,用起来更顺手:
#define MAX 100 #include <iostream> int main(){ char str1[MAX], str2[MAX]; std::cout <<" 1st string: "; std::cin.getline(str1, MAX); std::cout <<" 2nd string: "; std::cin.getline(str2, MAX); std::cout << str1 << "\n" << str2; return 0; }
3. 直接用std::string(强烈推荐)
如果你不是必须要用字符数组的话,用C++的std::string配合std::getline()是最方便的,完全不用操心缓冲区大小和换行符的问题:
#include <iostream> #include <string> int main(){ std::string str1, str2; std::cout <<" 1st string: "; std::getline(std::cin, str1); std::cout <<" 2nd string: "; std::getline(std::cin, str2); std::cout << str1 << "\n" << str2; return 0; }
这个方法会读取整行输入(包括空格),直到你按下回车,而且自动处理换行符,绝对不会出现提前终止的问题。
内容的提问来源于stack exchange,提问作者Shlok Srivastava

