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

Visual Studio间歇性抛出Buffer is too small断言错误求助

解决Visual Studio抛出的"Buffer is too small"断言异常问题

我帮你找出了代码里导致这个间歇性断言异常的几个关键问题,咱们一步步分析并修复:

1. 排序函数里的数组越界是核心元凶

在sort_Days函数的内层循环中,你从j=0开始遍历,然后直接访问days[j-1]——当j=0时,j-1=-1,这属于非法访问数组负下标,会乱读内存里的垃圾数据,很可能触发了Visual Studio的缓冲区断言检查。

修复时,把内层循环的起始值改成j=1,同时我还优化了循环的终止条件,减少不必要的重复排序:

void sort_Days(char days[][NUM_OF_COLS], int rows)
{
    char temp[NUM_OF_COLS];
    // 外层循环只需到rows-1,最后一个元素会自动归位
    for (int i = 0; i < rows - 1; i++) {
        // 内层从j=1开始,避免负下标,同时每次循环后减少尾部已排序的元素
        for (int j = 1; j < rows - i; j++) {
            if (strcmp(days[j - 1], days[j]) > 0) {
                strcpy_s(temp, days[j - 1]);
                strcpy_s(days[j - 1], days[j]);
                strcpy_s(days[j], temp);
            }
        }
    }
}

2. 打印函数的变量冲突+逻辑错误

print_Days里嵌套循环居然用了同一个变量名i,这会导致变量被覆盖,引发完全不可预测的行为;而且你原本的逻辑是逐个打印字符并换行,这显然不是你想要的(应该是每天的名称整行输出)。

修复后的打印函数简洁很多:

void print_Days(const char days[][NUM_OF_COLS], const int rows)
{
    for (int i = 0; i < rows; i++) {
        // 直接打印整个C-string,不用逐字符输出
        cout << days[i] << endl;
    }
}

3. 额外优化:文件读取的安全性

虽然当前用file >> days[i]能工作,但如果days.txt里的某个单词长度超过9个字符(比如不小心输入了超长字符串),会直接缓冲区溢出。换成getline可以限制读取长度,更安全:

void get_Days(ifstream& file, char days[][NUM_OF_COLS], int rows)
{
    // 假设文件里每行一个星期几,用getline读取更准确
    for (int i = 0; i < rows; ++i) {
        file.getline(days[i], NUM_OF_COLS);
    }
}

如果你的文件是用空格分隔星期几,那file >> days[i]也没问题,但一定要确保每个单词长度不超过9字符。

完整修正后的代码

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

//Constants for 2D array
const int NUM_OF_ROWS = 7; //Seven days listed in the file
const int NUM_OF_COLS = 10; //Longest word is 9 chars long, plus \0

void get_Days(ifstream& file, char days[][NUM_OF_COLS], int rows);
void sort_Days(char days[][NUM_OF_COLS], int rows);
void print_Days(const char days[][NUM_OF_COLS], const int rows);

void get_Days(ifstream& file, char days[][NUM_OF_COLS], int rows)
{
    //Read from text file (each day on a separate line)
    for (int i = 0; i < rows; ++i) {
        file.getline(days[i], NUM_OF_COLS);
    }
}

void sort_Days(char days[][NUM_OF_COLS], int rows)
{
    //Bubble sort for alphabetical order
    char temp[NUM_OF_COLS];
    for (int i = 0; i < rows - 1; i++) {
        for (int j = 1; j < rows - i; j++) {
            if (strcmp(days[j - 1], days[j]) > 0) {
                strcpy_s(temp, days[j - 1]);
                strcpy_s(days[j - 1], days[j]);
                strcpy_s(days[j], temp);
            }
        }
    }
}

void print_Days(const char days[][NUM_OF_COLS], const int rows)
{
    //Print sorted days line by line
    for (int i = 0; i < rows; i++) {
        cout << days[i] << endl;
    }
}

int main()
{
    //This program reads from days.txt, sorts days alphabetically, then prints results
    ifstream infile("days.txt");
    char days[NUM_OF_ROWS][NUM_OF_COLS];

    if (!infile) {
        cout << "File (days.txt) does not exist." << endl;
        return 1;
    }

    get_Days(infile, days, NUM_OF_ROWS);
    infile.close();

    sort_Days(days, NUM_OF_ROWS);
    print_Days(days, NUM_OF_ROWS);

    return 0;
}

这些修改应该能彻底解决你遇到的断言异常,同时让代码逻辑更清晰、运行更稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:49:08