#c #arrays #loops #struct #dynamic-memory-allocation
#c #массивы #циклы #структура #динамическое выделение памяти
Вопрос:
Я новичок в C, и у меня проблемы со структурами. после того, как я запрошу у пользователя все атрибуты, я хотел бы напечатать все значения структуры. Проблема в том, что после того, как я ввел все атрибуты в структуру, и она снова возвращается, чтобы запросить атрибуты во второй раз, первый структурный ввод заменяется вторым структурным вводом. Я почти уверен, что я снова и снова выделяю одно и то же пространство памяти и, таким образом, вызываю проблему, но я застрял на том, как это исправить. Я ценю любые советы о том, что я могу сделать. Спасибо!
case 2:
printf ("Please input a SKU number:");
scanf ("%d", amp;item[MAX_ITEMS].sku_);
printf ("Quantity:");
scanf ("%d", amp;item[MAX_ITEMS].quantity_);
printf ("Price:");
scanf ("%f", amp;item[MAX_ITEMS].price_);
printf ("The item is successfully added to the inventory");
break;
чтобы распечатать артикул, количество и цену
switch (menuSelection) {
case 1:
printf ("Inventoryn");
printf ("=========================================n");
printf ("Sku Price Quantityn");
for (i =0 ; i<=MAX_ITEMS; i ){
printf ("%d %.2f %dn", item[i].sku_, item[i].price_, item[i].quantity_);
}
printf ("=========================================n");
break;
вот весь мой код:
#include <stdio.h>
#define MAX_ITEMS 10
struct Item{
int sku_;
float price_;
int quantity_;
}item[MAX_ITEMS];
int main (void) {
int size=0;
int menuSelection;
int i=0;
printf ("Welcome to the Shopn");
printf ("===================");
do {
printf ("nPlease Select from the following options:n");
printf ("1) Display the inventory.n");
printf ("2) Add to shop.n");
printf ("0) Exit.n");
printf ("select:");
scanf ("%d", amp;menuSelection);
if (menuSelection <0 amp;amp; menuSelection >2){
printf ("Invalid input, try again: Please select from the following options:");
}
else {
switch (menuSelection) {
case 1:
printf ("Inventoryn");
printf ("=========================================n");
printf ("Sku Price Quantityn");
for (i =0 ; i<=MAX_ITEMS; i ){
printf ("%d %.2f %dn", item[i].sku_, item[i].price_, item[i].quantity_);
}
printf ("=========================================n");
break;
case 2:
printf ("Please input a SKU number:");
scanf ("%d", amp;item[size].sku_);
printf ("Quantity:");
scanf ("%d", amp;item[size].quantity_);
printf ("Price:");
scanf ("%f", amp;item[size].price_);
printf ("The item is successfully added to the inventory");
break;
case 3:
break;
}
}
} while (menuSelection != 0);
return 0;
}
Ответ №1:
Вы создаете массив Item
объектов длиной MAX_ITEMS
, который в данный момент находится 10
. То есть ваши объекты имеют индексы от 0
до 9
. Тем не менее, запрашивая у пользователя ввод, вы всегда сохраняете данные в item[MAX_ITEMS]
, которые находятся за пределами вашего массива.
В качестве дополнительного примечания, при печати вашего массива вы всегда печатаете его целиком, что означает также неинициализированные элементы.
Вы должны запомнить, сколько элементов уже «добавлено в магазин», и использовать это число для определения следующего индекса массива, в котором должен быть сохранен пользовательский ввод. При печати вам нужно только выполнить итерацию по уже сохраненным элементам. Не забывайте проверять границы, например, не разрешайте ввод нового пользователя, когда ваш магазин заполнен.
Ответ №2:
Проблема в том, что вы всегда сохраняете новые значения в одном и том же месте:
item[MAX_ITEMS].sku_
Вместо этого у вас должен быть счетчик, который показывает, сколько элементов сохранено, и сохраняет новые значения в месте, равном счетчику:
item[counter].sku_
и после каждой вставки вы должны увеличивать счетчик:
counter ;
Итак, ваш код должен выглядеть следующим образом:
int counter=0;
...
case 2:
printf ("Please input a SKU number:");
scanf ("%d", amp;item[counter].sku_);
printf ("Quantity:");
scanf ("%d", amp;item[counter].quantity_);
printf ("Price:");
scanf ("%f", amp;item[counter].price_);
printf ("The item is successfully added to the inventory");
counter ;
break;
Надеюсь, я был полезен
Комментарии:
1. Спасибо!! теперь код работает нормально, я знал, что для чего-то инициализировал переменную size в начале. в итоге я использовал size = 0 и size в качестве «счетчика» и заменил другие экземпляры max_item на i .
Ответ №3:
item
Вы определили массив размером MAX_ITEMS
, поэтому ваша проблема заключается не в struct, а в array.
В большинстве языков компьютерного программирования при индексации массива должно использоваться смещение, начинающееся с нуля. То есть, MAX_ITEMS
of item[MAX_ITEMS]
находится вне диапазона для массива, вы получили ошибку и не нашли ее. Когда вы добавляете товар в свой магазин, вы должны кодировать следующим образом:
case 2:
if (last < MAX_ITEMS - 1)
{
printf ("Please input a SKU number:");
scanf ("%d", amp;item[last].sku_);
// ...
last ; // on success
}
else
{
print("oops, shop is full.");
}