Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема со стеком(C++)

22K
18 декабря 2007 года
SMiX
18 / / 23.05.2007
Задача - создание стека со списком дисциплин(названия дисциплин - строки переменной длины). Проблема заключается в том, что, если создать дисциплину с длинным именем или создать 3+ дисциплин с именами длиной ~5 символов, возникают ошибки доступа к памяти на строках 36 или 83
Код:
//---------------------------------------------------------------------------

#pragma hdrstop
#include <alloc.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
//---------------------------------------------------------------------------

#pragma argsused

string rus(char s[]){
  string t;
  int i=0;
  t=s;
  while (t!=0)
  {
    if(t>='А'&& t<='п' )
       t-=64;
    if(t>='р'&& t<='я' )
       t-=16;
    i++;
  }
 return t;
}
struct dislist
{
 char * name;
 dislist * prev;
};

void add(dislist*&c,char * name)
{
 dislist * p;
 p=new dislist;
 p->name = (char*)malloc(sizeof(name));
 strcpy(p->name,name);
 p->prev=c;
 c=p;

}
bool find(dislist*c,char*name)
{
 do{
 if(strcmp(c->name,name))
 return true;
 c=c->prev;
 }while(c!=0);
 return false;
}
int main(int argc, char* argv[])
{
 int p; //номер пункта меню, вводимый пользователем
 char ch;
 char * name=0;
 dislist * c = 0;
 int i;
   do {
       cout<<endl;
       cout<<rus("1. Включить элемент в стек")<<endl;
       cout<<rus("2. Удалить элемент из стека")<<endl;
       cout<<rus("3. Найти элемент")<<endl;
       cout<<rus("0. Завершение работы")<<endl<<endl;
       cout<<rus("Укажите пункт меню: ");
       cin>>p;

        switch (p)
         {
          case 1:
          name = (char*)calloc(1,sizeof(char));
          i=-1;
          while((ch=getch())!='\r')
          {
           i++;
           name=(char*)realloc(name,sizeof(name)+sizeof(char));
           name = ch;
           cout<<ch;
           name[i+1] = '\0';
          }
          cout<<endl;
          add(c,name);
          free(name);
          cout<<rus("Добавлено")<<endl;
          break;
          case 3:
          name = (char*)calloc(1,sizeof(char));
          i=-1;
          while((ch=getch())!='\r')
          {
           i++;
           name=(char*)realloc(name,sizeof(name)+sizeof(char));
           name = ch;
           cout<<ch;
           name[i+1] = '\0';
          }
          cout<<endl;
          cout<<(find(c,name)?rus("Элемент найден"):rus("Элемент не найден"))<<endl;
          free(name);
          break;
          case 0:
          exit(0);
          break;
          default: cout<<rus("Ошибка" );
      }
   }while (true);

        return 0;
}


//---------------------------------------------------------------------------

[COLOR="Red"]Язык программирования указывать в названии темы!!![/COLOR]модератор.
[COLOR="Red"]Указал, потом при исправлении случайно стер ) сори[/COLOR]SMiX
22K
19 декабря 2007 года
SMiX
18 / / 23.05.2007
Проблема решена
Код:
//---------------------------------------------------------------------------

#pragma hdrstop
#include <alloc.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
//---------------------------------------------------------------------------

#pragma argsused

string rus(char s[]){
  string t;
  int i=0;
  t=s;
  while (t!=0)
  {
    if(t>='А'&& t<='п' ) // разница кодов этих символов 64
       t-=64;
    if(t>='р'&& t<='я' ) // разница кодов этих символов 16
       t-=16;
    i++;
  }
 return t;
}
struct dislist
{
 char * name;
 dislist * prev;
};

void add(dislist*&c,char * name)
{
 dislist * p;
 p=new dislist;
 p->name = name;
// strcpy(p->name,name);
 p->prev=c;
 c=p;

}
bool find(dislist*c,char*name)
{
 do{
 if(strcmp(c->name,name)==0)
 return true;
 c=c->prev;
 }while(c!=0);
 return false;
}
bool del(dislist *& c)
{
 if(c==0) return false;
 dislist * p = c;
 c = c->prev;
 delete p;
 return true;
}
void last(dislist * c)
{
 if(c==0) cout<<rus("Стек пуст")<<endl;
 else
 {
  cout<<c->name<<endl;
 }
}
int main(int argc, char* argv[])
{
 int p; //номер пункта меню, вводимый пользователем
 char ch;
 char * name=0;
 dislist * c = 0;
 int i;
   do {
       cout<<endl;
       cout<<rus("1. Включить элемент в стек")<<endl;
       cout<<rus("2. Найти элемент")<<endl;
       cout<<rus("3. Удалить последний элемент")<<endl;
       cout<<rus("4. Посмотреть последний элемент стека")<<endl;
       cout<<rus("5. Проверить, пуст ли стек")<<endl;
       cout<<rus("0. Завершение работы")<<endl<<endl;
       cout<<rus("Укажите пункт меню: ");
       cin>>p;

        switch (p)
         {
          case 1:
          cout<<rus("Введите имя дисциплины: ");
          name = (char*)calloc(1,sizeof(char));
          i=-1;
          while((ch=getch())!='\r')
          {
           i++;
           name=(char*)realloc(name,(i+2)*sizeof(char));
           name = ch;
           cout<<ch;
           name[i+1] = '\0';
          }
          cout<<endl;
          add(c,name);

          cout<<rus("Добавлено")<<endl;
          break;
          case 2:
          name = (char*)calloc(1,sizeof(char));
          i=-1;
          while((ch=getch())!='\r')
          {
           i++;
           name=(char*)realloc(name,(i+2)*sizeof(char));
           name = ch;
           cout<<ch;
           name[i+1] = '\0';
          }
          cout<<endl;
          cout<<(find(c,name)?rus("Элемент найден"):rus("Элемент не найден"))<<endl;
          break;
          case 3:
          cout<<(del(c)?rus("Элемент удален"):rus("Ошибка"))<<endl;
          break;
          case 4:
          last(c);
          break;
          case 5:
          if(c==0) cout<<rus("Стек пуст")<<endl;
          else cout<<rus("Стек не пуст")<<endl;
          break;
          case 0:
          exit(0);
          break;
          default: cout<<rus("Ошибка" );
      }
   }while (true);

        return 0;
}


//---------------------------------------------------------------------------
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог