C++代码输入异常咨询:首次输入后程序直接结束
代码问题分析与修复方案
核心问题:输入缓冲区残留的换行符
当通过cin >> num_of_cars读取整数时,用户输入的换行符会留在输入缓冲区中。后续调用cin.get(users_car.car_name, MAXLEN)时,该函数会将换行符视为输入结束的标志,直接读取到空字符串,导致程序跳过汽车品牌的输入步骤。紧接着的cin >> users_car.car_date因缓冲区无有效整数输入,会触发输入失败,最终导致程序异常结束。
其他明显问题
- 未定义
MAXLEN常量:代码中使用MAXLEN作为字符数组长度,但未提前定义,编译时会直接报错。需在代码开头添加#define MAXLEN 50(或其他合适长度)。 - 未实现多辆车存储:代码询问了要登记的车辆数量
num_of_cars,但仅定义了单个CAR变量,完全未利用该变量实现多辆车的数据存储,逻辑不符合需求。
修复后的完整代码
#include <iostream> #include <limits> // 用于清空输入缓冲区的工具类 #define MAXLEN 50 typedef struct car_description{ char car_name[MAXLEN]; int car_date; }CAR; int main() { using namespace std; int num_of_cars; cout << "How many cars do you wish to catalog? "; cin >> num_of_cars; // 清空缓冲区中残留的换行符,避免影响后续输入 cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 动态分配内存,适配用户输入的车辆数量 CAR* user_cars = new CAR[num_of_cars]; for (int i = 0; i < num_of_cars; ++i) { cout << "\nCar #" << i + 1 << ":" << endl; cout << "Please enter the make: "; cin.get(user_cars[i].car_name, MAXLEN); // 读取品牌后清空缓冲区的换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "Please enter the year made: "; cin >> user_cars[i].car_date; // 读取年份后清空缓冲区的换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); } cout << "\nYour car collection:" << endl; for (int i = 0; i < num_of_cars; ++i) { cout << user_cars[i].car_date << " " << user_cars[i].car_name << endl; } // 释放动态分配的内存,避免内存泄漏 delete[] user_cars; return 0; }
内容的提问来源于stack exchange,提问作者user20074138
相关产品推荐
相关产品推荐

