C++使用cin后调用getline()被跳过的新手问题及解决方法
C++ getline()被跳过问题解决方案
问题根因
cin >>读取输入时仅提取有效字符,不会处理输入完成后按下回车留在输入缓冲区的\n换行符getline()默认以换行符作为结束标识,碰到缓冲区残留的换行符会直接返回空内容,从现象看就是被跳过,没有等待用户输入。
解决方法
方案1:你测试可用的实现
你提到的在getline前增加cin >> ad;的写法可以解决问题,但存在限制:如果你的地址包含空格,开头第一个空格前的内容会被cin >> ad读取,后续getline只能拿到空格后的内容,无法保留完整的带空格地址。
cin>>ad; getline(cin, ad);
方案2:通用兼容方案(推荐)
仅需在调用getline前清理掉缓冲区残留的换行符即可,无需额外读取变量,兼容带空格的地址输入:
// 忽略缓冲区中残留的1个换行符 cin.ignore(); getline(cin, ad);
附带优化点
你代码中的头文件#include <string.h>是C语言的字符串处理头文件,C++标准string类对应的头文件应为#include <string>,修改后可避免部分编译器的兼容问题。
完整可运行代码
#include <iostream> #include <string> using namespace std; int main(){ string n,s,a,ad,e; cout<<"Your name: "<<endl; cin>>n; cout<<"Hello, "<<n<<endl; cout<<"Your surname: "<<endl; cin>>s; cout<<"Your age: "<<endl; cin>>a; cout<<"Your address: "<<endl; cin.ignore(); getline(cin,ad); cout<<"Your email: "<<endl; cin>>e; cout<<"Done."<<endl; cout<<"Name: "<<n<<" "<<s<<endl; cout<<"Age: "<<a<<endl; cout<<"Address: "<<ad<<endl; cout<<"Email: "<<e<<endl; return 0; }
内容的提问来源于stack exchange,提问作者Levan Markozia
相关产品推荐
相关产品推荐

