С++
Подправьте пожалуйста код, чтобы strcpy_s работало
void CategoryTovar(char* category) {
char cat[][12]{
"Пряжа",
"Фурнiтура",
"Iнструменти",
};
int x;
do {
cout << "Оберіть категорiю (1 - Пряжа, 2 - Фурнiтура, 3 - Iнструменти): ";
cin >> x;
if (cin) {
if (x == 1 x == 2 x == 3) {
strcpy_s(category, cat[x - 1]);
cin.ignore();
break;
}
else {
cout << "Введіть число вiд 1 до 3!" << endl;
}
}
else {
cout << "Введiть число, а не інші символи!" << endl;
cin.clear();
cin.ignore(1000, '\n');
}
} while (true);
}
Answers & Comments
Здесь есть несколько ошибок:
Неправильно записано условие для проверки x. Нужно использовать логический оператор || (или) вместо x, чтобы проверить, что x равно 1, 2 или 3.
В строке strcpy_s(category, cat[x - 1]); необходимо указать размер буфера, куда копируется строка cat[x - 1].
Вот исправленный код:
void CategoryTovar(char* category) {
const char cat[][12] = {
"Пряжа",
"Фурнiтура",
"Iнструменти"
};
int x;
do {
cout << "Оберіть категорiю (1 - Пряжа, 2 - Фурнiтура, 3 - Iнструменти): ";
cin >> x;
if (cin) {
if (x == 1 || x == 2 || x == 3) {
strcpy_s(category, 12, cat[x - 1]);
cin.ignore();
break;
}
else {
cout << "Введіть число вiд 1 до 3!" << endl;
}
}
else {
cout << "Введiть число, а не інші символи!" << endl;
cin.clear();
cin.ignore(1000, '\n');
}
} while (true);
}
Здесь в strcpy_s я указал размер буфера равный 12, так как максимальная длина любого элемента в массиве cat - 11 символов (10 символов для текста категории и один символ для нулевого окончания).
const char* cat[] = { "Пряжа", "Фурнiтура", "Iнструменти" };
int x;
do {
cout << "Оберіть категорiю (1 - Пряжа, 2 - Фурнiтура, 3 - Iнструменти): ";
cin >> x;
if (cin) {
if (x >= 1 && x <= 3) {
strcpy_s(category, strlen(cat[x - 1]) + 1, cat[x - 1]);
cin.ignore();
break;
}
else {
cout << "Введіть число вiд 1 до 3!" << endl;
}
}
else {
cout << "Введiть число, а не інші символи!" << endl;
cin.clear();
cin.ignore(1000, '\n');
}
} while (true);
}
Зміни в коді:
1. Додано ключове слово const перед двома масивами char, щоб забезпечити неможливість їх зміни в процесі виконання.
2. Виправлено помилку в умові, що порівнювала x з трьома значеннями. 3. Додано логічний оператор && між умовами.
4. Використано функцію strcpy_s замість strcpy, передавши в неї розмір буфера для копіювання.