@Anther
Начинающий

Можно ли удалить пробелы в начале и в конце строки без создания нового массива?

То есть у нас есть, допустим, 5 байт. Первые два и последний это пробел, остальное это символы. Можно ли как освободить память которую заняли пробелы и оставить только память для символов?

char* str = "  ab ";
// some code 
// str == "ab"


то есть мы никак не трогаем ab (у них остаётся тот же адрес), мы только освобождаем память, где лежат пробелы
  • Вопрос задан
  • 456 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Строковый литерал " ab " находится в особом сегменте данных, который (если процессор и ОС позволяют) только для чтения. А память сегмента данных освободить и сделать «кучей» нельзя.

Если предположить, что текст " ab " находится в «куче» — эта самая куча является сложной структурой данных и память выделяется с выравниванием. Потому функция realloc может (но не обязана) отдать конец или приделать память к концу. Отдать начало будет сложнее, и ни одна известная мне библиотека функций на это не способна.

Кроме того, Си++ придумал объект string_view именно для этого — чтобы передавать строки в функцию, абстрагируясь от выделения памяти и даже от оконечного нуля. Потому у string_view нет функции c_str().

Разумеется, вы можете сделать что-то вроде
char* str2 = str + 2;
str2[2] = '\0';
// А str оставь, уничтожать как-то придётся

Разумеется, если str находится в куче. Сегмент с литералами, напоминаю, только для чтения, и в ОС вроде DOS, где менять можно, такая замена может вызвать нехорошие побочки.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Освободить память нельзя, тем более, что при таком обьявлении выделение памяти происходит в куче. Обрезать строку можно - начальные пробелы срезаются просто перестановкой указателя, конечные - перестановкой символа '\0'.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы