C ++ Buffer太小错误

时间:2018-01-20 03:09:37

标签: c++ c-strings strcpy

在运行我的代码时,Visual Studio会间歇性地抛出异常。我间歇性地说,因为我已经能够成功运行我的代码而没有错误。创建函数" print_Days后,抛出了错误。"

抛出的异常是:

  

调试断言失败!

     

文件:minkernel \ crts \ ucrt \ corecrt_internal_string_templates.h

     

行:81

     

表达式:(L"缓冲区太小"&& 0)

该函数从列出一周中7天的.txt文件(星期一到星期日)读取,然后按字母顺序对2D c-string数组中的天数进行排序(教授让我们使用c-string而不是字符串) )。

以下是我的所有代码:

#include <iostream>
#include <fstream>
#include <string>
#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 and return day
   for (int i = 0; i < rows; ++i)
   {
      file >> days[i];
   }
}

void sort_Days(char days[][NUM_OF_COLS], int rows) {
   //Sort the array alphabetically
   char temp[NUM_OF_COLS];
   for (int i = 0; i < rows; i++)
   {
      for (int j = 0; j < rows; 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 the sorted array to the console
   for (int i = 0; i < NUM_OF_ROWS; ++i)
      for (int i = 0; i < rows; i++)
      {
         for (int j = 0; j < NUM_OF_COLS; j++)
         {
            cout << days[i][j] << endl;
         }
      }
}

int main() {
   //This program reads from a file (days.txt), sorts the days 
   // alphabetically, and then prints the result to the console.
   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;
}

1 个答案:

答案 0 :(得分:2)

代码有些问题:

<强> sort_Days

sort_Days算法抛出错误,因为当嵌套for循环以days[j - 1]开头时,您尝试索引j = 0。所以你的初始索引超出界限。

此外,您似乎正在尝试对c样式字符串执行冒泡排序,但您的冒泡排序实现不正确。有关如何实施简单的冒泡排序,请参阅this page。提示:for循环条件,strcmpstrcpy_s索引需要进行一些调整。

<强> print_Days

您的print_Days功能不正确。这是一个打印出每个c风格字符串的版本,而不是字符串中的每个char

void print_Days(const char days[][NUM_OF_COLS], const int rows) 
{
    for (int j = 0; j < rows; j++)
    {
        cout << days[j] << endl;
    }
}

你应该知道std::cout明白当你传递一个c风格的字符串(即char[NUM_OF_COLS]中的days)时,就意味着你要打印出整个字符串了到null终止符。

您的for循环终止条件也是错误的,因为您有j < NUM_OF_COLS,而days实际上是一个带有NUM_OF_ROWS元素的数组,并且每个元素都是一个数组NUM_OF_COLS大小。你拥有它的方式已经超出了days数组的范围。

而我正在挑剔

尽量不要使用using namespace::std;there are plenty of reasons why you shouldn't.