Лидеры рейтинга

ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

379

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Советник

378

Россия, Санкт-Петербург


ID: 401888

puporev

Профессор

216

Россия, Пермский край


ID: 405338

vovaromanov.jr

1-й класс

130


ID: 400669

epimkin

Профессионал

112


ID: 242862

Hunter7007

Мастер-Эксперт

30

Россия, Омск


ID: 137394

Megaloman

Мастер-Эксперт

26

Беларусь, Гомель


8.10.2

13.10.2021

JS: 2.10.2
CSS: 4.6.0
jQuery: 3.6.0
DataForLocalStorage: 2021-10-19 18:16:01-standard


Создание программ на языках C и C++.

Администратор раздела: CradleA (Мастер-Эксперт)

Консультация онлайн # 108946

Раздел: С / С++
Автор вопроса: Navnav
Дата: 11.11.2007, 15:59 Консультация закрыта
Поступило ответов: 4

Добрый день. Как грамотно добавить символ char к строке char[] (язык Си)?
Функция strcat добавляет только строки. Я использовал такую конструкцию:
s[n-1]=st[i];
s[n]='\0';
Это работает, но мне кажется что это не совсем грамотно.

Ответ # 193253 от Argus98
Здравствуйте, Navnav!
это важно! перед тем как записывать нашу информацию в какую-то ячейку, её надо выделить функцией new или malloc (calloc для массивов), т. к. в невыделенной ячейке могла уже содержаться какая-то информация, которую мы в процессе записи теряем. как правило для c++ лучше всего использовать new. в конце программы надо обязательно надо почистить выделенную память: delete или free. для c++ желательно использовать использовать delete. посмотрите пример, нежелательные, но возможные варианты закомментированы. чтобы с помощью new выделить массив, надо пользоваться примерно такой записью: b = new char [30]; если непонятно, можете ещё почитать здесь http://www.codenet.ru/webmast/java/02.php, подзаголовок "распределение памяти"

Приложение:


Argus98

Посетитель
11.11.2007, 16:30
Ответ # 193257 от Алексей Демаков
Здравствуйте, Navnav!

Если в области памяти еще есть место, то делать так, как вы написали вполне нормально. Если места нет и используется динамическая память (выделенная с помощью malloc/calloc), то предварительно потребуется увеличить размер области с помощью функции realloc

s = realloc( s, strlen(s) + 1 + 1 ); // 1 из-за '\0', 1 для нового символа

Алексей Демаков

Посетитель
11.11.2007, 16:48
Ответ # 193281 от kool
Здравствуйте, Navnav!
Символ можно использовать и как строку
состоящую из одного символа и заканчивающаюся нулем,
а дальше рулит strcat.
strcat(s+n-1,"a");
Удачи!

kool

Посетитель
11.11.2007, 20:10
Ответ # 193321 от Титов Михаил Анатольевич
Здравствуйте, Navnav!

Это может быть неграмотно только в том смысле, что если s объявлена как

char s[n]

, то:
1) s[n-1] может не совпадать с действительным концом строки в s, длина строки, действительно находящейся в s может быть меньше;
2) оператор s[n]='\0'; пишет 0 за пределами массива s! : в массиве размер n первый элемент имеет индекс 0, а последний n-1.

Специальной функции добавления char к строке (char[]) в стандартной библиотеке Си нет. Но ничего не мешает использовать strcat(my_string, "x"), где x - добавляемый символ.

Если хочется руками, то можно написать свою функцию, типа как в приложении

Приложение:


Титов Михаил Анатольевич

Посетитель
12.11.2007, 04:11
Мини-форум консультации # 108946
Алексей Демаков

1

= общий =    11.11.2007, 18:15

В стандартной библиотеке такой функции, насколько я помню, нет. Но ничто не мешает вам определить ее самостоятельно. Операция-то достаточно рискованная, такой функцией надо будет пользоваться с осторожностью, либо внутри делать realloc на всякий случай. С вообще достаточно низкоуровневый язык, о красоте говорить не приходится. Вернее, красота есть, но своеобразная :)

Navnav

2

= общий =    11.11.2007, 19:36

Ну нет так нет. Вопрос не стоит как выйти из положения. Вопрос стоит как это делать красиво. Я думал что есть подход, которого я не знаю. Пришлось вернуться практически в DOS, поэтому хочется использовать отработанные подходы к решению (если они есть). Так как я сделал -- работает. Но мне не нравится непосредственное внесение значения и, затем нулевого символа. Все другое (что придумал) выглядие еще неприглядее. Можно, например, переводить символ в строку и использовать strcat. Но тоже неприглядно. Что ж, видно со строками Си работать красиво не может. Спасибо за консультацию

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Лучшие эксперты раздела

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 122

Gluck

8-й класс

Рейтинг: 61

Коцюрбенко Алексей Владимирович

Старший модератор

Рейтинг: 48

CradleA

Мастер-Эксперт

Рейтинг: 2

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 0

Асмик Гаряка

Советник

Рейтинг: 0