![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
qw1mb0 |
|
|||
Непутевый студент ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 24.4.2010 Где: Севастополь Репутация: нет Всего: нет |
Выполняю работу для университета.
Появилась ошибка, с которой никак не могу разобраться
В цикле while я беру строку, с помощью функции sscanf получаю необходимое мне слово. Далее мне нужно присвоить итому элементу массива gz, указатель на это слово, что бы в итоге получить массив указателей и в дальнейшем нужно с помощью сортировку упорядочить эти элементы. Программа завершается аварийно. В чем проблема не пойму. Как присвоить и в итоге получить этот массив. Для дальнейшей сортировки. Спасибо большое заранее. Буду благодарен за дельные советы. |
|||
|
||||
tzirechnoy |
|
||||||||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: -1 Всего: 16 |
Вы в строку размера 10 читаете до 100 символов. Это ошыбка. [quote]
Переменная i неиницыализирована. Кроме того, atoi у меня содержытся в stdlib.h, который неподключен.
Строка gz после i неиницыализирована, в частности, туда, вероятно, никто не записал символ окончания строки '\0'. Хотя есть вариант, что пользователь ввёл 0 с клавиатуры, тогда этот код выведет просто перевод строки, но он довольно безсмысленнен.
Массив gz состоит из чаров (8-битных цэлых чисел, от -128 до 127), присваивать ему указатели будет сложновато. Впрочем, atoi и не возвращает никаких указателей ни на что -- оно преобразует человекочитаемую строчку цыфр в цэлое число во внутреннем машынном представлении. |
||||||||||||
|
|||||||||||||
qw1mb0 |
|
||||||||
Непутевый студент ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 24.4.2010 Где: Севастополь Репутация: нет Всего: нет |
Подправил
вначале изменил int i; на int i=0;
Честно говоря не очень понял. Не могли бы привести пример как добавить \0. Пока что программа не сильно изменилась:
Выводит какие-то знаки. Если заменить в printf %s на %d выводит числовое представление. Что-то не особо даются мне типы и указатели.... |
||||||||
|
|||||||||
qw1mb0 |
|
||||
Непутевый студент ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 24.4.2010 Где: Севастополь Репутация: нет Всего: нет |
Немного переписал программу и добавил структуру.
Вот что получилось:
Выводяться крякозябры. Что я делаю не так, почему в filel_list[i].name хранится не строка? Добавлено через 4 минуты и 5 секунд Хм... Интересно. Переставил i++; после printf и стало выводить то. что мне надо.... Добавлено через 9 минут и 37 секунд Тогда другой вопрос: Допустим есть строка: Filename exe 12.12.12 32 1282 82.32 где 1. Имя файла, 2. Тип файла, 3. Дата создания, 4. Количество обращений, 5. размер, 6. Дата последней модификации Как можно заполнить структуру:
нужными полями данных? |
||||
|
|||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Вручную парсить строку, проверяя корректность данных. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
qw1mb0 |
|
|||
Непутевый студент ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 24.4.2010 Где: Севастополь Репутация: нет Всего: нет |
Дошел до такой конструкции:
Но при выполнении программа зависает. Может кто-то может взглянуть и сказать свою точку зрения? В чем может быть ошибка |
|||
|
||||
rumit7 |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 16.6.2011 Репутация: нет Всего: 7 |
1) Массив z в который Вы считываете слова имеет размер 10. Это значит, что Вы можете его запросто переполнить, т.е. выйти за пределы памяти, которую Вам выделеди. Это может привести к большим проблемам. Либо увеличти его размер до 100 (такой-же как и размер массива s), либо используйте вместо "%s" - "%ns", где n зависит от размера массива. Более подробно читайте в книгах. У Стефана Прата есть хорошая книга по Си. Там работа со строками расписывается очень подробно; 2) Нельзя просто так присваивать массив z указателю name! Теперь указатель name будет указывать на область памяти массива z. А в следующей итерации цикла while, Вы в массив z уже считываете что-то другое. Таким образом теряете предыдущее значение. Для всех name, type, date память нужно выделять отдельно (их либо нужно сделать массивами соот. длины, или выделить память динамически при помощи функции malloc) и затем комировать туда при помощи функции strcpy() или strncpy(), что безопаснее; 3) Так делать нельзя: filel_list[i].syze = *(int*)z. Нужно вызывать функцию, которая предназначена для преобразования из строки в число. Что-то вроде atoi или sscanf.. 4) Переменная p имеет тип int и иницилизируется нулевым значением. Дальше в конструкции swicth Вы сравниваете p с символами '0', '1'.. Так не правильно, нужно сравнивать с числами 0,1,2... Наверное легче исправить Ваш код самому, чем рассказывать азы программирования на Си. В общем читайте сначала книги.. |
||||
|
|||||
rumit7 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 16.6.2011 Репутация: нет Всего: 7 |
Наверное так:
Код не проверял, писал в браузере.. |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |