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

Обсуждение

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

Приложение:
char a[20] = "qwertyuiopasdfghjkl"; char* b = &a[20]; b = new char;// b = (char*) malloc (sizeof(char));// b = (char*) calloc (1, sizeof(char)); a[19] = ‘z‘; a[20] = 0; printf ("%s", a); delete b;// free(b);
Неизвестный
11.11.2007, 16:48
общий
это ответ
Здравствуйте, Navnav!

Если в области памяти еще есть место, то делать так, как вы написали вполне нормально. Если места нет и используется динамическая память (выделенная с помощью malloc/calloc), то предварительно потребуется увеличить размер области с помощью функции <a href=http://www.codenet.ru/progr/cpp/spru/realloc.php>realloc</a>

s = realloc( s, strlen(s) + 1 + 1 ); // 1 из-за ‘\0‘, 1 для нового символа
Неизвестный
11.11.2007, 18:15
общий
В стандартной библиотеке такой функции, насколько я помню, нет. Но ничто не мешает вам определить ее самостоятельно. Операция-то достаточно рискованная, такой функцией надо будет пользоваться с осторожностью, либо внутри делать realloc на всякий случай.С вообще достаточно низкоуровневый язык, о красоте говорить не приходится. Вернее, красота есть, но своеобразная :)
Неизвестный
11.11.2007, 19:36
общий
Ну нет так нет. Вопрос не стоит как выйти из положения. Вопрос стоит как это делать красиво. Я думал что есть подход, которого я не знаю. Пришлось вернуться практически в DOS, поэтому хочется использовать отработанные подходы к решению (если они есть).Так как я сделал -- работает. Но мне не нравится непосредственное внесение значения и, затем нулевого символа. Все другое (что придумал) выглядие еще неприглядее. Можно, например, переводить символ в строку и использовать strcat. Но тоже неприглядно. Что ж, видно со строками Си работать красиво не может. Спасибо за консультацию
Неизвестный
11.11.2007, 20:10
общий
это ответ
Здравствуйте, Navnav!
Символ можно использовать и как строку
состоящую из одного символа и заканчивающаюся нулем,
а дальше рулит strcat.
strcat(s+n-1,"a");
Удачи!
Неизвестный
12.11.2007, 04:11
общий
это ответ
Здравствуйте, 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 - добавляемый символ.

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


Приложение:
void strcat_char(char *s, char c) // вопрос 108946{ while(*s) s++; // ищем конец строки *s = c; // пишем символ поверх предыдущего \0 *++s = ‘\0‘; // пишем новый признак конца строки}
Форма ответа