1 / 1 / 0
Регистрация: 23.09.2015
Сообщений: 42
|
||||||
1 | ||||||
Реализация своей функции getline12.10.2015, 09:08. Показов 21527. Ответов 57
Метки нет (Все метки)
Здравствуйте! Не могу решить задачку.
Постановка: Реализуйте функцию getline, которая считывает поток ввода посимвольно, пока не достигнет конца потока или не встретит символ переноса строки ('\n'), и возвращает C-style строку с прочитанными символами. Обратите внимание, что так как размер ввода заранее неизвестен, то вам нужно будет перевыделять память в процессе чтения, если в потоке ввода оказалось больше символов, чем вы ожидали. Память, возвращенная из функции будет освобождена оператором delete[]. Символ переноса строки ('\n') добавлять в строку не нужно, но не забудьте, что в конце C-style строки должен быть завершающий нулевой символ. Мой код:
В чем ошибка ? Консоль зависает после перехода на новую строку.
0
|
12.10.2015, 09:08 | |
Ответы с готовыми решениями:
57
Реализация getline Реализация функций getline Delim в функции getline() Какой правильный вызов у функции getline()? |
13 / 13 / 6
Регистрация: 29.09.2015
Сообщений: 38
|
|
12.10.2015, 09:41 | 2 |
У вас цикл бесконечный 11-15 строки.
Внутри цикла переменная с не изменяется. В 12 строке вы указателю m присваиваете новое значение при этом не освобождаете память на которую он указывал.
1
|
202 / 138 / 88
Регистрация: 21.12.2014
Сообщений: 369
|
|||||||||||
12.10.2015, 09:45 | 3 | ||||||||||
1) Память надо освобождать.
1
|
1 / 1 / 0
Регистрация: 23.09.2015
Сообщений: 42
|
||||||
12.10.2015, 15:06 [ТС] | 4 | |||||
Исправил так:
0
|
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
|
|
12.10.2015, 15:12 | 5 |
Операция >> считает '\n' разделителем и отбрасывает. Используй get().
1
|
12.10.2015, 15:34 | 6 | |||||
плохой совет - не нужно сначала освобождать память, а затем копировать, нужно наоборот.
Добавлено через 21 минуту JustForStudy, попробуйте так
1
|
1 / 1 / 0
Регистрация: 23.09.2015
Сообщений: 42
|
|
14.10.2015, 15:24 [ТС] | 7 |
0
|
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
|
|
14.10.2015, 15:40 | 8 |
Извлечь 1 символ.
1
|
1 / 1 / 0
Регистрация: 23.09.2015
Сообщений: 42
|
||||||
14.10.2015, 15:51 [ТС] | 9 | |||||
Вроде бы
Попробовал вашу программу - вроде работает, но тестирование не проходит.
Попробовал исправить свою, в итоге она зависает в цикле. Не подскажете в чем снова я накосячил ?
0
|
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
|
|
14.10.2015, 16:01 | 10 |
Сначала создать новую строку, скопировать туда и только после delete.
1
|
13 / 13 / 6
Регистрация: 29.09.2015
Сообщений: 38
|
|
14.10.2015, 16:01 | 11 |
13 и 15 строки.
temp это указатель на m, удалив m, temp указывает в никуда.
1
|
1 / 1 / 0
Регистрация: 23.09.2015
Сообщений: 42
|
|
14.10.2015, 18:32 [ТС] | 13 |
Да, конечно. Сайт "Степик", курс "Программирование на языке C++", урок 2.6, задача 1.
Добавлено через 2 часа 3 минуты А как компилятор узнает какое количество ячеек в памяти необходимо удалить ? Это же указатель.
0
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
||||||
14.10.2015, 20:24 | 15 | |||||
1
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
|
|
14.10.2015, 20:28 | 16 |
поскольку нет вызовов конструкторов я бы воспользовался
malloc realloc free realloc сам перевыделит память и сам все скопирует и перевыделял бы память не по 1 символу а допустим по 100, скорость возрастет
1
|
1 / 1 / 0
Регистрация: 23.09.2015
Сообщений: 42
|
||||||
15.10.2015, 09:39 [ТС] | 17 | |||||
В задании сказано, что
Добавлено через 15 минут А зачем тут нужны скобки ? Блин, я не понимаю... Вроде бы сделал по вашему примеру - программа все равно виснет в цикле. Подскажите, что я снова сделал не так ?
0
|
15.10.2015, 10:48 | 18 |
инициализация массива нулями (нуль-терминаторами в данном случае).
прежде чем записывать символ, под него должна быть выделена память, а не наоборот.
1
|
1 / 1 / 0
Регистрация: 23.09.2015
Сообщений: 42
|
||||||
15.10.2015, 15:26 [ТС] | 19 | |||||
Исправил. Все равно вылетает при работе на строчке delete[] temp;
Не подскажете в чем дело ?
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
15.10.2015, 17:51 | 20 |
Да тут много чего не так.
Например вот: Это же не массив, а один символ со значением 2. Скобки для массива - квадратные. Вот в прошлом задании у тебя было нужно реализовать resize. Эта функция здесь нужна - сильно упростит дело. Ее специально дали первым заданием, чтобы потом можно было использовать во втором. Редкий случай, когда задания связаны и помогают, помимо обучения кодированию, еще и с подходами к разработке - в данном случае учат повторному использованию кода.
1
|
15.10.2015, 17:51 | |
15.10.2015, 17:51 | |
Помогаю со студенческими работами здесь
20
Третий аргумент функции sdt :: getline Отсутствуют экземпляры перегруженной функции getline Некорректный ввод строк с использованием функции getline Использование функции в своей программе из своей dll Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |