You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:39:00