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

C++结构体问题:无法输入完整姓名及Date结构体变量异常

C++程序问题解决

问题1:无法输出完整姓名

你用cin >> person.name读取姓名时,cin默认以空格、换行等空白字符作为分隔符,输入带空格的姓名(比如"张三 李四")时,只会读取第一个空格前的内容,后面的部分会留在输入缓冲区里。

解决方法:用getline(cin, person.name)替换原来的cin >> person.name,getline会读取整行输入(直到按下回车),包含空格在内的所有字符。

问题2:无法向Date结构体输入数据

这是问题1引发的连锁错误:当你输入带空格的姓名时,cin >> person.name只取了前半部分,剩下的字符串留在输入缓冲区。接下来程序读取day时,会把这些残留的字符串当成数字输入,导致读取失败,后续的month、year输入也跟着出错,看起来像是无法给Date变量赋值。

只要解决了第一个问题,用getline读取完整姓名,输入缓冲区就不会残留错误内容,Date的输入就能正常进行。

修改后的完整代码

#include<iostream>
#include <string>

using namespace std;

int main() {
    // 日期结构体
    struct Date {
        int day, month, year;
    };

    // 访客信息结构体
    struct Visitor {
        string name;
        Date visitday;
    };

    Visitor person;

    cout << "Enter Name-";
    getline(cin, person.name); // 读取完整姓名
    cout << "\nEnter Day- ";
    cin >> person.visitday.day;
    cout << "\nEnter Month- ";
    cin >> person.visitday.month;
    cout << "\nEnter Year- ";
    cin >> person.visitday.year;
    
    // 输出结果
    cout << "\nName- " << person.name << "\nDay of Visit- ";
    cout << person.visitday.day << "/" << person.visitday.month << "/" << person.visitday.year;

    return 0;
}

额外注意

如果之后你的代码中,getline前面有cin >>类型的输入(比如先读取一个整数年龄),需要先调用cin.ignore()清除输入缓冲区里的换行符,否则getline会直接读取到空行。示例:

int age;
cin >> age;
cin.ignore(); // 清除换行符
getline(cin, person.name);

内容的提问来源于stack exchange,提问作者Mohammad Aslam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:41:06