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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:41:01