| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Работа со списками |
| Автор: Ripper 16.10.2007, 19:44 | ||
Я уже писал тут задачу, когда нужно было центрировать строку. Сейчас делаю тоже самое для списков, и вот проблема:
Вот этот код запускаю в DevC++ с помощью debug. - работает. Без debug не работает, как и в VC++ не работает. Я уже запарился разрисовывать бумагу с этими указателями Нужно просто сделать например из " 11 3 4 4 3 " -> "11 3 4 4 3" т.е. удалить пробелы (оставить 1 между символами). Что не так?:( ф-ии создания списков взял с семинарской тетради, хотя впринципе везде должно работать и ошибка видимо в DelSpaces |
| Автор: archimed7592 16.10.2007, 22:11 | ||
|
| Автор: Ripper 17.10.2007, 08:36 |
| Это что) Нам запрещено использовать библиотечные ф-ии да и я таких незнаю. Я что то совсем не понял смысла этого кода |
| Автор: Lazin 17.10.2007, 08:39 | ||
Проблема в том, что в ф-ии DelSpaces происходит использование указателя last до его инициализации, при первом его использовании там находится мусор:
|
| Автор: Ripper 17.10.2007, 10:46 |
| Первый раз этот блок не работает, т.к. to указывает на null, а потом он уже инициализируется |
| Автор: archimed7592 17.10.2007, 10:56 |
| Ripper, тебе обязательно реализовывать удаление через список? |
| Автор: Ripper 17.10.2007, 11:32 |
| Ага. Там все должно быть через списки... |
| Автор: Ripper 17.10.2007, 12:09 |
| Что-то вообще не понимаю :( что значит char buf[80]="";? Если я пишу char gg[80]; значит gg указатель но первый элемент и Item *HeadOfBuf = CreateList(buf); работает. Но не понимаю насчет инициализации. И как сделать так чтобы это все дело заработало? |
| Автор: akizelokro 17.10.2007, 12:12 | ||||||
| Lazin прав. На VC++ вырубается. И дальше ни в какую. Сделай Item * last = new Item; Первая (не столь критичная) ошибка возникает еще раньше, когда ты пытаешься
заюзать буфер buf, в котором у тебя непонятно что. если тебе нужны два списка с одинаковым количеством элементов, то тогда уже хотя напиши перед этим
И еще проблема, что ты используешь неоптимальный алгоритм. У тебя есть список. Сделай по нему "пробежку"
|
| Автор: Lazin 17.10.2007, 12:24 | ||||
Ripper, когда ты пишешь
то выделяется 80 байт под массив, в стеке. Изначально в этом массиве может быть все что угодно. И если ты вызовешь к примеру strlen(buf); может произойти ошибка доступа, из-за того, что buf может вообще не содержать '\0', а может и не произойти. Можно сделать так
и после этого все ф-ии для работы со строками будут считать что там строка нулевой длины, в том числе и твои ф-ии. |
| Автор: akizelokro 17.10.2007, 12:30 | ||
Смысл последнего куска, что ты работаешь с одним списком, проверяешь текущий элемент на наличие пробела, если есть, тут же смотришь на наличие пробела у следующего элемента. Если там пробел (два пробела подряд), то следующий элемент удаляешь (что я забыл сделать, ну так поправят), а указатель из удаляемего вытаскиваешь в текущий. И так до конца списка.
Не надо определять формальные аргументы с типом Item* &, это не есть хорошо. Все я исправлять не стал, но, попробуй, должно сработать. |
| Автор: Ripper 17.10.2007, 12:30 |
| О..эм... спасибо вроде работает. Да, тяжело познание си Добавлено через 1 минуту и 23 секунды Это я к варианту Lazina akizelokro, твой ещё не смотрел... но вроде тока добавив buf[0]='\0' заработало, но щас и твой посмотрю Добавлено через 4 минуты и 9 секунд p.s. stdafx.h незя использовать. а что это? Добавлено через 5 минут и 45 секунд работает, только 1 строчку убрать надо и там мелкие опечатки. + первый пробел не удаляется. Блин, щас мозг взорвется..) |
| Автор: akizelokro 17.10.2007, 12:43 | ||
Угу, буквально воспринял задачу, что надо два и более подряд пробелов сводить к одному
<stdafx.h> - стандартный Виндовый хидер для консоли, удаляй его из своего кода. |
| Автор: Ripper 17.10.2007, 12:50 |
| просто мне ещё удобней вводить 3 массива т.к. потом нужно будет центрировать полученную строку. Покранемере при работе с массивами строк так было удобно. 1 массив вводит пользователь. 2 массив это когда строка имеет корректный вид. третий массив это строка размером 80 символов где по бокам равное кол-во пробелов а в середине 2 массив Тем неменее спасибо всем! |
| Автор: akizelokro 17.10.2007, 13:02 |
| И третий массив тоже не нужен. Подсчитаешь количество элементов с пробелами, которые нужно вставить слева и справа, и просто их добавишь в список. |