Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема с массивом структур


Автор: maxim_89 5.6.2007, 12:07
Всем привет,  помогите, пожалуйста с лабой...
Проблема в том, что во время работы программа подменяет данные в структурах,
и после вывода результата прога виснет наглухо...

Код


#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
#define n 2


struct Price
{
  char *Tovar;
  char *Mag;
  long int Stoim; };

void OutPut(Price Spisok[])
{
   for (int i=0;i<n;i++)
{  cout<<Spisok[i].Tovar<<"\n";
   cout<<Spisok[i].Mag<<"\n";
   cout<<Spisok[i].Stoim<<"\n";
   cout<<"-----------------\n\n";
}
  getch();
}

void main()
{
  clrscr();
  Price Spisok[n];
  cout<<"‹ Лаба  9. Структкры.   \n\n";

  for (int i=0;i<n;i++)

{ cout<<"Товар  "<<i+1<<"  ....\n\n";
  cout<<"Что купил?\n";
  gets(Spisok[i].Tovar);
  cout<<"А магазинчик не подскажешь??\n";
  gets(Spisok[i].Mag);
  cout<<"Сколько??\n";
  cin>>Spisok[i].Stoim;
  cout<<"----------------\n";  }

  OutPut(Spisok);

  getch();
}



Дайте, плиз, ссылку на хорошую книгу по работе с указателями ....

Автор: FiMa1 5.6.2007, 12:23
Код
gets(Spisok[i].Tovar);

Попытка поместить по неизвестному адресу (т.к. Tovar на данный момент неинициализированный указатель) строку. Следует либо строго задать размер массива char'ов, например, вида Tovar[ANY_SIZE], либо предварительно выделить память под строку.
Если нужно решение "на коленке", то, примерно, вот так:
Код
#include <iostream>
using namespace std;

#define SIZE_OF_LIST 2

struct Price
{
    char    GoodName[30];
    char    ShopName[30];
    int        Cost;
};

void OutPut( Price List[] )
{
    for (int i = 0; i < SIZE_OF_LIST; i++)
    {
        cout << List[i].GoodName << endl;
        cout << List[i].ShopName << endl;
        cout << List[i].Cost     << endl;
    }
}

void main()
{
    Price List[SIZE_OF_LIST];
  
    for (int i = 0; i < SIZE_OF_LIST; i++)
    {
        cout << "GoodName " << i + 1 << endl;
        cout << "What has you bought? ";
        gets( List[i].GoodName );
        cout << "There is it shop? ";
        gets( List[i].ShopName );
        cout << "How much? ";
        cin >> List[i].Cost;
    }
    OutPut(List);
}


Почитать про указатели можно в любой книге по программированию на Си/Си++.

Автор: medicdim 5.6.2007, 12:34
Я тут немного подправил: убрал указатели и явно указал длины строк.



Код

#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
#define n 2


struct Price
{
  char Tovar[20];
  char Mag[20];
  long int Stoim; };

  Price Spisok[n];

void OutPut()
{
   for (int i=0;i<n;i++)
{  cout<<Spisok[i].Tovar<<"\n";
   cout<<Spisok[i].Mag<<"\n";
   cout<<Spisok[i].Stoim<<"\n";
   cout<<"-----------------\n\n";
}
  getch();
}

void main()
{
  clrscr();

  cout<<"‹ Ëàáà  9. Ñòðóêòêðû.   \n\n";

  for (int i=0;i<n;i++)

{ cout<<"Òîâàð  "<<i+1<<"  ....\n\n";
  cout<<"×òî êóïèë?\n";
  gets(Spisok[i].Tovar);
  cout<<"À ìàãàçèí÷èê íå ïîäñêàæåøü??\n";
  gets(Spisok[i].Mag);
  cout<<"Ñêîëüêî??\n";
  cin>>Spisok[i].Stoim;
  cout<<"----------------\n";  }

  OutPut();

  getch();
}

Автор: DigitSphinx 5.6.2007, 13:07
Зачем gets(); ??
Код

#include "stdafx.h"
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
using namespace std;
#define n 2
struct Price
{
  char Tovar[20];
  char Mag[20];
  long int Stoim; 
};
Price Spisok[n];
void OutPut()
{
   for (int i=0;i<n;i++)
    {  
       cout<<Spisok[i].Tovar<<"\n";
       cout<<Spisok[i].Mag<<"\n";
       cout<<Spisok[i].Stoim<<"\n";
       cout<<"-----------------\n\n";
    }
}

void main()
{
  cout<<"‹ ??\n\n";

  for (int i=0;i<n;i++)
    { 
      cout<<"Òîâàð  "<<i+1<<"  ....\n\n";
      cout<<"TOVAR?\n";
      cin >> Spisok[i].Tovar;
      cout<<"MAG??\n";
      cin >> Spisok[i].Mag;
      cout<<"STOIM??\n";
      cin>>Spisok[i].Stoim;
      cout<<"----------------\n";  
  }

  OutPut();
  getch();
}

Автор: maxim_89 5.6.2007, 15:12
Спасибо за помощь!
теперь все работает...
Цитата

Зачем gets(); ??


просто мне в этой лабе нужно еще и со строками поработать...
Кроме того, если мы в поля .Tovar или .Mag попытаемся через cin>> впихнуть что-то вроде
"Big shop", то в это поле получим только "Big", а нашего препода это не устраивает....  
 Спасибо еще раз. smile 

Автор: Nil 5.6.2007, 15:43
maxim_89, gets нормальному преподователю думаю тоже не понравится... cin.GetLine ну или что-то в этом роде. А раз уж собрался работать со строками, то бросайте уже этот char =) Еше...
Код

#define n 5

страшная строчка имхо =)

Автор: JackYF 5.6.2007, 16:06
Цитата(Nil @  5.6.2007,  15:43 Найти цитируемый пост)
cin.GetLine ну или что-то в этом роде


маленькими буквами. STL не использует больших букв в интерфейсах:
Код

std::cin.getline


Цитата(Nil @  5.6.2007,  15:43 Найти цитируемый пост)
страшная строчка имхо =)

гм, согласен.
Используй что-то вроде:
Код

const unsigned int n = 5;



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)