Пожалуйста, обратите внимание, что вы всегда должны стараться, чтобы описать, что именно не работает и то, что вы пытались, чтобы исправить это. В большинстве случаев его списание помогает вам решить свои собственные ошибки. Тем не менее, вот несколько советов:
В коде есть как минимум 3 ошибки.
Первый заключается в том, что sizeof(supplies)
возвращает размер расходных материалов в байтах, а не в количестве элементов. Так, как было предложено Привет, я Frogatto вы должны использовать либо std::size(supplies)
, либо sizeof(supplies)/sizeof(supplies[0])
(байты для всех элементов по размеру одного элемента равны количеству элементов).
Обратите внимание, что использование std::size
требует C++ 17 и #include <iterator>
согласно cppreference.com. Я настоятельно рекомендую использовать шаблон c++11
std::array<>
, который предлагает array.size()
. Он широко поддерживается и в основном все средства лучше использовать, чем собственный массив при написании современного кода C++.
Вторая проблема заключается в том, что вы итерацию по списку элементов доступного и каждый раз вы пропустите один вы непосредственно добавить его в список не найдено вещей. Например. если вы входите в яблоко, то это не соответствует банану, яйцу и любви и будет добавлено в список вещей, которые мы не нашли три раза. Сначала вы должны перебрать список, чтобы узнать, был ли элемент в списке, сохраняя результат в логическом выражении, а затем добавьте его в список агрессивных ответов. Если вы не хотите самостоятельно его кодировать, вы можете взглянуть на std::find()
, который прекрасно работает с std::array<>
.
cout << "Type the name of the item!" << endl;
cin >> good;
bool found = false;
for(int y=0; y < supplies.size(); y++) {
if(good == supplies[y])
found = true;
}
if (found) {
shopping_cart[gd_counter++] = good;
cout << "we have that item!" << endl;
} else {
wanted_goods[wd_counter++] = good;
cout << "we do not have that item!" << endl;
}
Третья проблема заключается в том, что вы позволяете пользователю вводить неограниченное количество элементов, в то время как ваши буфера имеют место только для четырех элементов. Как только кто-то вводит более 4 найденных или необоснованных элементов, ваши индексы исчерпывают область массивов и запускают segfault (или проблему безопасности с возможной инъекцией кода).
while (x == 'A' || x == 'B'){
if(x == 'B'){
break;
}
else {
// handle user input here
if (gd_counter < shopping_cart.size()
&& wd_counter < wanted_goods.size()) {
cout << "do you want to complete!?" << endl;
cin >> x;
} else {
cout << "you can't add more items!" << endl;
break;
}
}
}
В целом код работает для меня, как это (вы можете попробовать это here):
#include <iostream>
#include <array>
#include <algorithm>
using namespace std;
int main(){
char x;
std::array<string, 4> supplies{"apple", "banana" , "egg", "love"};
std::array<string, 4> shopping_cart;
std::array<string, 4> wanted_goods;
string good;
int gd_counter=0;
int wd_counter=0;
cout << "welcome to my shopping list, tap A to cont. and B to quit!" << endl;
cin >> x;
while (x == 'A' || x == 'B'){
if(x == 'B'){
break;
}
else {
cout << "Type the name of the item!" << endl;
cin >> good;
if (std::find(supplies.begin(), supplies.end(), good) != supplies.end()) {
shopping_cart[gd_counter++] = good;
cout << "we have that item!" << endl;
} else {
wanted_goods[wd_counter++] = good;
cout << "we do not have that item!" << endl;
}
if (gd_counter < shopping_cart.size()
&& wd_counter < wanted_goods.size()) {
cout << "do you want to complete!?" << endl;
cin >> x;
} else {
cout << "you can't add more items!" << endl;
break;
}
}
}
cout << "shopping card:" << endl;
for(int z=0; z<gd_counter; z++){
cout << shopping_cart[z] << endl; // print out what the user has found in my shopping list
}
cout << "wanted goods:" << endl;
for(int c=0; c<wd_counter; c++){
cout << wanted_goods[c] << endl; // print out the items that the user has not found it
}
}
Так что ваш вопрос? –
Как исправить программу, я пробовал столько раз ... –