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

如何解决C++代码中while循环接收4次以上输入后意外终止的问题

故障成因
  • 首要问题是动态内存分配语法使用错误:你代码中int *Angka = new int(x);的含义是申请1个int类型的堆内存空间,并将该空间的初始值设为x(此时x为0),并不是你以为的「申请长度为x的int数组」。C++中申请动态数组的正确语法是new int[数组长度],使用方括号而非小括号。
  • 直接触发崩溃的原因是数组越界访问:你自始至终只申请了1个int的存储空间,循环输入时不断向Angka[x]位置写入数据,当x≥1时就已经发生了非法的内存越界写入,属于C++标准中的「未定义行为」。这类行为的表现完全取决于运行环境:在线编译器环境下越界写入的内存刚好没有被程序其他逻辑占用,所以看似运行正常;而MinGW编译后的程序在写入越界内存时覆盖了栈上的控制数据(比如函数返回地址、循环变量值等),就会直接触发崩溃、卡死的现象,这不是编译器的问题,是代码本身的内存错误。
  • 额外的逻辑缺陷:即便你修正了初始的数组申请语法,由于你没有做数组扩容逻辑,只要输入的元素数量超过初始数组的长度,仍然会触发越界问题。同时排列数计算逻辑没有做参数合法性校验,当用户输入的选取数量大于总数字量时会触发死循环和整数溢出。
修复建议

推荐直接使用std::vector代替手动管理动态数组,容器会自动处理扩容逻辑,不需要手动管理内存,也能避免越界问题。修复后的参考代码如下:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    int KombAngka;
    bool Lanjut = true;
    int x = 0;
    vector<int> Angka; // 用vector代替手动动态数组
    
    string YaTidak;
        
    while(Lanjut) {         
        int input;
        cout << "Number-" << x + 1 << ": "; 
        cin >> input;
        Angka.push_back(input); // 自动扩容
        
        LoopYaTidak:
        cout << "Are the numbers enough?(y/n)?: ";
        cin >> YaTidak;

        if (YaTidak == "y") {
            Lanjut = false;
        }
        else if (YaTidak == "n") {
            Lanjut = true;
        }
        else {
            cout << "Enter the correct answer!(y/n)" << endl;
            goto LoopYaTidak;
        }
        
        x++;
    }

    cout << "All numbers: (";
    for (int z = 0; z <= x - 2; z++) {
        cout << Angka[z] << ", ";
    }
    cout << Angka[x - 1] << ")" << endl;

    // 增加合法性校验
    cout << "The number of combinations of numbers used: ";
    cin >> KombAngka;
    if (KombAngka > x || KombAngka < 1) {
        cout << "Invalid input! The number must be between 1 and " << x << endl;
        system("pause");
        return 1;
    }

    long long JumlahAngka = x; // 用long long避免整数溢出
    const int StopLoop = x - KombAngka;
    for (int i = x - 1; i > StopLoop; i--) {
        JumlahAngka = JumlahAngka * i;
    } 
      
    cout << "The number of queue numbers consisting of " << KombAngka << " different numbers are " << JumlahAngka << endl;
    
    system("pause");
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:54:03