Добавить значение C-строки в структуре C++
Я пытаюсь добавить строковое значение ("Appliance", "Kitchenware" или "Tool") в строковый массив C "category[CATEGORY_SIZE]", расположенный в struct newItem, но как только пользователь попытается это сделать, программа завершается. Может кто-нибудь объяснить, почему это так и как правильно хранить строковое значение, если я делаю это неправильно?
#include <fstream>
#include <iostream>
#include <sstream>
#include <cctype>
using namespace std;
//Array sizes
const int CATEGORY_SIZE = 15, DATE_SIZE = 12;
//Declare structure for record
struct Item
{
int SKU;
string category[CATEGORY_SIZE];
int quantity;
double cost;
string date[DATE_SIZE];
};
int main()
{
//declare variables
int answer;
int cat;
int month;
string categoryChoice;
string monthChoice;
string theNumberString;
string theNewNumberString;
string fullDate;
int dayChoice;
int yearChoice;
char anotherRecord;
Item newItem; // to hold info about an item.
fstream dataFile;
fstream data("test.dat", ios::out | ios::binary);
cout << "This program allows you to store inventory data for appliances, kitchenware,
and tools in a file.";
while (true)
{
cout << "What would you like to do? :\n\n";
cout << "1. Add new records to the file\n";
cout << "2. Display a record in the file\n";
cout << "3. Change any record in the file\n";
cout << "4. Display total wholesale value of a particular item inventory.\n";
cout << "5. Display total wholesale value of a particular category inventory.\n";
cout << "6. Display total quantity of all items in the inventory." << endl;
cout << "Please enter a number[1-6] or enter 0 to quit program: ";
cin >> answer;
if (answer == 0)
{
return 0;
}
if (answer < 0 || answer > 6)
cout << "That is not a valid response, please try again. ";
if (answer == 1)
{
while (true)
{
cout << "Enter the following data about an item: \n\n";
cout << "SKU Number (Stock Keeping Unit Number): ";
cin >> newItem.SKU;
cin.ignore(); //Skip over the remaining newline.
while (true)
{
cout << "Please enter what category the item falls in : \n";
cout << "1. Appliance \n" "2. Kitchenware \n" "3. Tool: \n" << endl;
cout << "Please enter a choice [1-3]: ";
cin >> cat ;
if (cat < 1 || cat > 3)
cout << "Invalid choice. Please select again." << endl;
else if (cat == 1)
{
newItem.category[CATEGORY_SIZE] = "Appliance";
break;
}
else if (cat == 2)
{
newItem.category[CATEGORY_SIZE] = "Kitchenware";
break;
}
else if (cat == 3)
{
newItem.category[CATEGORY_SIZE] = "Tool";
cout << newItem.category[CATEGORY_SIZE];
break;
}
}
}
}
1 ответ
newItem.category[CATEGORY_SIZE] = "Appliance";
(И также): у вас неопределенное поведение. Вы получаете доступ к массиву за пределами, потому что индексы попадают в диапазон [0, size)
, Использовать std::vector
и либо push_back
или же emplace_back
(в зависимости от поддержки C++11):
std::vector<std::string> category; //you can construct this with an initial size
...
newItem.category.push_back("Appliance");