【发布时间】:2014-05-09 06:42:53
【问题描述】:
我是一名学生,刚刚学习 c++,所以我确信有更有效的方法可以做到这一点;话虽如此,我真的很感激能帮助我弄清楚我的程序崩溃的原因。我已将其范围缩小为 strcpy 函数,该函数会使所有内容崩溃并破坏它,我已将其注释掉并标记。我显然在程序中多次使用了类似参数的 strcpy 函数,所以我不明白为什么那个特定的函数会崩溃。我已经尝试了我能想到的一切,并且非常感谢您的帮助。到目前为止,我已经注释掉了很多内容,因此它应该使用名为“bookdb”的正确文本文件运行,我的文本文件中目前有这个
Active Learning Approach,Randal Albert,9780763757236,1,650,1,<br>
Technical Communications,John Lannon,9780321899972,2,724,0,
要查看错误,您必须取消注释 strcpy(bookArray[num_books].author_name, temp_authorName);
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstring>
enum Genres {HORROR=1, SCIFI, COMEDY, DRAMA, ACTION};
struct Book
{
char title[100];
char author_name[50];
char isbn[14];
Genres genre;
int num_pages;
bool paperback;
};
//Function Declarations
unsigned short ReadBooks(Book * bookArray, unsigned short & num_books);
void DisplayBooks(Book * bookArray, unsigned short num_books);
void ResizeArrays(Book * bookArray, unsigned short num_books);
int main ()
{
unsigned short num_books = 0;
Book * bookArray = new Book();
num_books = ReadBooks(bookArray, num_books);
}//End Main
unsigned short ReadBooks(Book * bookArray, unsigned short & num_books)
{
ifstream readBooks("bookdb.txt");
char temp_title[100] = "0";
char temp_authorName[100] = "0";
char temp_isbn[14] = "0";
char temp_genre[50] = "0";
char temp_numPages[50] = "0";
char temp_paperback[50] = "0";
int genreNumber = 0,
numPages = 0,
paperback = 0;
if (readBooks.is_open() )
{
cout << "The file was successfully opened\n" << endl;
readBooks.getline(temp_title, 100, ',');//Reads into temp cstring
strcpy(bookArray[num_books].title, temp_title); //copies to dynamic cstring
//cout << bookArray[num_books].title << endl; //displays part of structure to make sure it worked!!
readBooks.getline(temp_authorName, 100, ',');
strcpy(bookArray[num_books].author_name, temp_authorName);
//cout << bookArray[num_books].author_name << endl;
readBooks.getline(temp_isbn, 14, ',');
strcpy(bookArray[num_books].isbn, temp_isbn);
//cout << bookArray[num_books].isbn << endl;
readBooks.getline(temp_genre, 50, ',');//Get the genre as a char
genreNumber = atoi(temp_genre);//converts char to an int
bookArray[num_books].genre = static_cast <Genres> (genreNumber);//converts int to ENUM
//cout << bookArray[num_books].genre << endl;//Displays ENUM to make sure it worked!!
readBooks.getline(temp_numPages, 50, ',');
numPages = atoi(temp_numPages); //converts char to an int
bookArray[num_books].num_pages = numPages; //assigns int to structure
//cout << bookArray[num_books].num_pages << endl; //Displays part of structure to make sure to works!!
readBooks.getline(temp_paperback, 50, ',');
paperback = atoi(temp_paperback); //converts char to an int
bookArray[num_books].paperback = static_cast <bool> (paperback);
//cout << bookArray[num_books].paperback << endl;
num_books++;
//DisplayBooks(bookArray, num_books);
ResizeArrays(bookArray, num_books);
cout << "The number of books is: " << num_books << endl;
//while (!readBooks.eof() )
//{
readBooks.getline(temp_title, 100, ',');//Reads into temp cstring
strcpy(bookArray[num_books].title, temp_title); //copies to dynamic cstring
cout << bookArray[num_books].title << endl; //displays part of structure to make sure it worked!!
readBooks.getline(temp_authorName, 100, ',');
cout << temp_authorName << endl;
//strcpy(bookArray[num_books].author_name, "0");
///THIS BREAKS MY CODE////strcpy(bookArray[num_books].author_name, temp_authorName);
//cout << bookArray[num_books].author_name << endl;
readBooks.getline(temp_isbn, 14, ',');
//strcpy(bookArray[num_books].isbn, temp_isbn);
//cout << bookArray[num_books].isbn << endl;
readBooks.getline(temp_genre, 50, ',');//Get the genre as a char
//genreNumber = atoi(temp_genre);//converts char to an int
//bookArray[num_books].genre = static_cast <Genres> (genreNumber);//converts int to ENUM
//cout << bookArray[num_books].genre << endl;//Displays ENUM to make sure it worked!!
readBooks.getline(temp_numPages, 1000, ',');
//numPages = atoi(temp_numPages); //converts char to an int
//bookArray[num_books].num_pages = numPages; //assigns int to structure
//cout << bookArray[num_books].num_pages << endl; //Displays part of structure to make sure to works!!
readBooks.getline(temp_paperback, 50, ',');
//paperback = atoi(temp_paperback); //converts char to an int
//bookArray[num_books].paperback = static_cast <bool> (paperback);
//cout << bookArray[num_books].paperback << endl;*/
num_books++;
//ResizeArrays(bookArray, num_books);
//}//End while
readBooks.close();
}//End if
else
{
cout << "There was not an existing book file, so one will be created" << endl;
}//End else
return 0;
}//End ReadBooks
void DisplayBooks(Book * bookArray, unsigned short num_books)
{
for (unsigned short i = 0; i < num_books; i++)
{
cout << setw(30) << left << bookArray[i].title << left << setw(20) << bookArray[i].author_name << left << setw(15) << bookArray[i].isbn
<< left << setw(3) << bookArray[i].genre << left<< setw(6) << bookArray[i].num_pages << left << setw(4) << bookArray[i].paperback << endl;
}//End For
}//ENd Display Function
void ResizeArrays(Book * bookArray, unsigned short num_books)
{
Book * temp_bookArray = new Book[num_books + 1];
for (int i = 0; i < num_books; i++)
{
strcpy(temp_bookArray[i].title, bookArray[i].title);
//cout << temp_bookArray[i].title << endl; //For Debugging
strcpy(temp_bookArray[i].author_name, bookArray[i].author_name);
//cout << temp_bookArray[i].author_name << endl; //for Debugging
strcpy(temp_bookArray[i].isbn, bookArray[i].isbn);
//cout << temp_bookArray[i].isbn << endl;//for debugging
temp_bookArray[i].genre = bookArray[i].genre;
//cout << temp_bookArray[i].genre << endl;//for debugging
temp_bookArray[i].num_pages = bookArray[i].num_pages;
//cout << temp_bookArray[i].num_pages << endl;// for debugging
temp_bookArray[i].paperback = bookArray[i].paperback;
//cout << temp_bookArray[i].paperback << endl; //for debugging
}//End for
delete [] bookArray;
bookArray = temp_bookArray;
DisplayBooks(bookArray, num_books); //debugging to make sure bookArray is reassigned
}//End Resize Function
【问题讨论】:
-
突出的问题是你分配了一个
Book,然后你使用一个指向它的指针,因为它是一个数组。删除new和指针,这样会更难犯这种错误。 -
从 C 到 C++ 的过程中你应该摆脱的东西:
char []支持string。 任何 类型的数组,支持vector。有利于引用的指针参数。构造函数之外的动态内存分配。当然,这过于简单化了,但这是一个很好的第一条经验法则。您的struct Book应该是一个类,该类的函数(ReadBooks()、DisplayBooks()等)成员。这是最低限度的。您可以忽略所有其他内容 - 继承、模板、异常等 - 但不做我上面提到的事情,您基本上可以继续使用 C。;-) -
你的代码有太多的破坏,这就引出了一个问题,它是怎么写的?在任何情况下,您都应该尝试将问题缩小到单个问题,并发布可以重现该问题的最少但独立的代码。一堵错误的代码对于一个问题来说太多了。
标签: c++ visual-c++ assertions strcpy