Занесение слов в стек
От: Minx  
Дата: 11.12.02 06:59
Оценка:
(prinashu izvinenija po-povodu latinizy )

Для преобразования транслита в "нормальный" текст существуют соответствующие утилиты. -- ПК

Раскраска кода добавлена модератором. -- ПК

Zadacha zakliuchajetsia v tom, jest' slova neopredelionnoj dliny (kotoryje vybirajutsia iz faila po ocheredi) i ix nado zanesti v stek.
Problema zakliuchajetsia v tom, shto kokgda ja zanosu eto slovo, naprimer v:

char wr[20];


to nikakix problem, a vot kak zanesti slovo neopredelionnoj dliny tipa:

char* wr;


???
ja pytalas' zapisat' eto vot tak:

int i=0;
STACK *seka1;
                                                                     

void push(char* wr, STACK **seka2)
 {       if (i==0) seka1=NULL;
         i++;  
          (*seka2)=(STACK*)malloc(sizeof(STACK));      
        (*seka2)->next=seka1;
        seka1=(*seka2);    
        (*seka2)->slovo=wr;    
        
  }



a steka u meniaopisan tak:


#define STACK  struct str

typedef  STACK
        {char* slovo;
           STACK *next; };



no takim sposovom, pri pechate steka, on vyvodit tol'ko posledneje slovo stol'ko raz, skol'ko bylo vsego slov.

Pomogite pozhalujsta bednoj studentochke!!! Budu ochen' blagodarna
Re: Занесение слов в стек
От: Bell Россия  
Дата: 11.12.02 07:21
Оценка:
Здравствуйте, Minx, Вы писали:

Используем стандартную библиотеку...

#include <stack>
#include <string>
#include <fstrem>

using namespace std;

int main()
{
   ifstream input("MyFileName");//входной поток
   string str;//строка переменной длины
   stack<string> myStack;//стэк строк переменной длины

   while(input >> str)
      myStack.push(str);//читаем из ыайла и помещаем в стэк

   str = myStack.top();//взять элемент с вершины стэка
   myStack.pop();//удалить элемент с вершины стэка

   //преобразование std::string в строку в стиле С
   char* str2 = new char[str.length() + 1];
   strcpy(str2, str.c_str());

   ...
   
   delete [] str2;
}
Любите книгу — источник знаний (с) М.Горький
Re: Занесение слов в стек
От: mik1  
Дата: 11.12.02 10:35
Оценка:
Здравствуйте, Minx,
В Вашем коде проблема заключается в том, что либо:
1)Вы не выделяете память под КОПИЮ слова при помещении его в Вашу структуру стека
2)В основной программе словоопределено как буфер либо постоянного размера, либо под него
была ОДНОКРАТНО выделена память.

Во 2-м случае (который скорее всего имеет место быть) Вы помещаете в стек УКАЗАТЕЛЬ НА ОДНУ И ТУ ЖЕ ОБЛАСТЬ ПАМЯТИ. А в основной части программы перед помещением нового слова в стек Вы ее перезаписываете.

Поэтому в итоге Вы получаете в стеке кучу ссылок на один и тот же адрес, где, ясное дело, лежат одни и те же данные.

Я догадываюсь, что это студенческое задание по программированию, поэтому ответ Bell про использование STL тут не пригоден (самого за такое умничание заставляли в универе переписывать задания заново).

В общем решение здесь состоит в выделении памяти под слова при помещении их в стек:

(*seka2)->slovo=strdup(wr);


Только не забудьте потом (при удалении стека) эту память освободить.

С наилучшими пожеланиями,
Михаил.
Re[2]: Занесение слов в стек
От: Awaken Украина  
Дата: 11.12.02 11:30
Оценка:
M>Я догадываюсь, что это студенческое задание по программированию, >поэтому ответ Bell про использование STL тут не пригоден (самого за >такое умничание заставляли в универе переписывать задания заново).

ну если так то надо было написать: "требуется реализва на C (не C++)"
а красиво оно решается именно с помощью контейнеров STL
Re[3]: Занесение слов в стек
От: mik1  
Дата: 11.12.02 14:56
Оценка:
Здравствуйте, Awaken, Вы писали:

M>>Я догадываюсь, что это студенческое задание по программированию, >поэтому ответ Bell про использование STL тут не пригоден (самого за >такое умничание заставляли в универе переписывать задания заново).


A>ну если так то надо было написать: "требуется реализва на C (не C++)"

A>а красиво оно решается именно с помощью контейнеров STL

Ну просто в конце вопроса было "помогите бедной студенточке". Да и реализация ручная... Всего несколько лет назад сам такие вещи сдавал...
Ну а насчет красиво (да, вообщем-то и ПРАВИЛЬНО) — то тут ты безусловно прав.
Re[2]: Занесение слов в стек
От: Аноним  
Дата: 12.12.02 07:03
Оценка:
Здравствуйте, mik1!

Раскраска кода добавлена модератором. -- ПК

Vy mne ochen' pomogli,bol'shoje spasibo za podskazku Podozrenija po povodu studencheskogo zadaniija pravil'ny. (priamo v tochku!) Vot tak vot odna takaja strochka mozhet vsio ispravit'. ja tak i dumala, shto dlia slovo v steke nado vydeliat' pamiat', tol'ko delala eto ne pravil'no, a kak pravil'no ne znala. Nu teper' tochno zapomniu.
A vot jeschio odin voprosik, (naverno on Vam pokazhetsia glupym...):
Vy govorili, shto pri udalenii steka (ja delala proceduru POP) nado osvobodit' etu vydelennuju pamiat', a kak eto sdelat'?
Jesli u menia jest':

(*seka2)->slovo=strdup(wr);


to kogda ja udaliaju stek:

void pop(STACK *seka2,FILE *output)
{
    while (seka2)
    {
      fprintf(output,"%s\n",seka2->slovo);
     // free(seka2->slovo);
      seka1=seka2;
      seka2=seka2->next;
      free(seka1);

      }
 }


Tak nado osvobozhdat'? Cherez "free(seka2->slovo)"? naverno eto ne pravil'no ili eta strochka dolzhna byt' v drugom meste...
Pomogite jeschio razok, PLEASE!!!
Jesli eto vozmozhno, to kak mozhno skoreje!!!

P.S. A to ja segodnia ochen' xochu otchitatsia, a lekzija vot-vot nachniotsia...

V liubom sluchai bol'shoje spasibo

S uvazhenijem
Jelena.
Re[3]: Занесение слов в стек
От: mik1  
Дата: 12.12.02 10:30
Оценка:
Добрый день, Елена.

Да, память, выделенную функцией strdup нужно освобождать через вызов free.
Сама strdup реализуется примерно так:

char* strdup(char* str)
{
    char *lpstr = (char*)malloc(strlen(str) + 1);
    if (!lpstr)
       return NULL;
    strcpy(lpstr, str);
    return lpstr;
}


Прошу прощения, что ответил с задержкой — выходной день, поздно вылез в интернет.

С наилучшими пожеланиями,
Михаил.

Избыточное цитирование удалено модератором. -- ПК
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.