Для преобразования транслита в "нормальный" текст существуют соответствующие утилиты. -- ПК
Раскраска кода добавлена модератором. -- ПК
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;
}
#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;
}
Здравствуйте, Minx,
В Вашем коде проблема заключается в том, что либо:
1)Вы не выделяете память под КОПИЮ слова при помещении его в Вашу структуру стека
2)В основной программе словоопределено как буфер либо постоянного размера, либо под него
была ОДНОКРАТНО выделена память.
Во 2-м случае (который скорее всего имеет место быть) Вы помещаете в стек УКАЗАТЕЛЬ НА ОДНУ И ТУ ЖЕ ОБЛАСТЬ ПАМЯТИ. А в основной части программы перед помещением нового слова в стек Вы ее перезаписываете.
Поэтому в итоге Вы получаете в стеке кучу ссылок на один и тот же адрес, где, ясное дело, лежат одни и те же данные.
Я догадываюсь, что это студенческое задание по программированию, поэтому ответ Bell про использование STL тут не пригоден (самого за такое умничание заставляли в универе переписывать задания заново).
В общем решение здесь состоит в выделении памяти под слова при помещении их в стек:
(*seka2)->slovo=strdup(wr);
Только не забудьте потом (при удалении стека) эту память освободить.
M>Я догадываюсь, что это студенческое задание по программированию, >поэтому ответ Bell про использование STL тут не пригоден (самого за >такое умничание заставляли в универе переписывать задания заново).
ну если так то надо было написать: "требуется реализва на C (не C++)"
а красиво оно решается именно с помощью контейнеров STL
Здравствуйте, 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':
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...