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
相关产品推荐
相关产品推荐

