Как добавить необходимый текст в начало или конец строки
Иногда необходимо дописать в файл информацию во все строки или только в определенные. Это шпаргалка поможет.
Как добавить текст в начало строки
Если необходимо добавить какой-то текст или символ в начало каждой строки файла (file) воспользуйтесь следующими командами:
# sed 's/^/ДОБАВЛЯЕМЫЙ ТЕКCТ/' file
# awk '' file
Как добавить текст в конец строки
Если необходимо добавить какой-то текст или символ в конец каждой строки файла (file) воспользуйтесь следующими командами:
# sed 's/$/ДОБАВЛЯЕМЫЙ ТЕКCТ/' file
# awk '' file
Как добавить текст в начало и конец строки
Если необходимо добавить информацию в начало и конец каждой строки файла (file) воспользуйтесь следующими командами:
# sed 's/.*/ТЕКСТ НАЧАЛА СТРОКИ&ТЕКCТ КОНЦА СТРОКИ/' file
# awk '' file
Как добавить текст в определенные строки
Если необходимо добавить текст в конец строк файла имеющих в тексте, например, «deb».
# grep -F "deb" file | sed -ie 's/$/& ДОБАВЛЯЕМЫЙ ТЕКCТ/g'
Если надо добавить текст в строки файла, начинающиеся с deb, с помощью sed :
# sed -ie 's/^deb.*$/& ДОБАВЛЯЕМЫЙ ТЕКCТ/g' file
Можно сделать с использованием awk :
# awk '/^deb/' file > newfile && mv newfile file
Если вы хотите использовать скрипт с вызовом переменной, то синтаксис может быть немного другим:
var="deb" grep -F "$var" file | sed -ie 's/$/& ДОБАВЛЯЕМЫЙ ТЕКCТ/g' sed -ie "s/^$var.*$/& ДОБАВЛЯЕМЫЙ ТЕКCТ/g" file awk '/^'$var'/' file > newfile && mv newfile file
Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии:
CC Attribution-Noncommercial-Share Alike 4.0 International
Запись в начало строки
Все можно сделать, используя стандартные C функции, объявленные в заголовке .
#include #include int main( void )
Вывод программы на консоль
001111
Если строка не дополнена нулями, то копировать надо не strlen( string ) символов, а strlen( string ) + 1 символ.
То есть в общем случае правильно будет записать
#include #include int main( void ) < char string[20] = "1111"; size_t count = 2; memmove( string + count, string, strlen( string ) + 1 ); // ^^^^^^^^^^^^^^^^^^^^^ memset( string, '0', count ); puts( string ); return 0; >
Как в своем комментарии указал Pink Tux, в общем случае вы должны проверять, содержит ли исходный массив достаточно места, чтобы можно было сдвинуть вправо хранящуюся в нем строку.
Отслеживать
ответ дан 16 окт 2016 в 21:55
Vlad from Moscow Vlad from Moscow
44.8k 3 3 золотых знака 38 38 серебряных знаков 89 89 бронзовых знаков
Влад, законно ли после char string[20] = «1111» пытаться что-то поменять в string ?
16 окт 2016 в 22:07
В общем случае я бы поостерёгся подобных фокусов в принципе 🙂 Как вариант — функция, выделяющая память размером strlen(source) + prefix_length+1
16 окт 2016 в 22:08
@andy.37, вполне законно, но чревато неприятностями типа вылета за размер string .
16 окт 2016 в 22:09
@PinkTux Никаких «фокусов» здесь нет.:) Это обычная работа с массивами.
16 окт 2016 в 22:11
@andy.37 В объявлении массива указано, что он содержит 20 элементов. Поэтому сколько вы указали в его объявлении элементов, столько он и будет содержать. Что касается инициализации, то на самом деле он будет инициализирован как < '1', "2', '3', '4', '\0', '\0'. '\0' >; То есть все элементы, не инициализированные явно, будут инициализированы нулями.
16 окт 2016 в 22:22
В принципе всё правильно, кроме одной строки:
for (i = length + count - 1; i == 0; i--)
for (i = length + count; i >= count; i--)
И это (в вашем случае) лишнее:
if (i == length + count)
С учётом обсуждений про выход за границы массива (ну и уж со стандартными функциями. )
static char *_pad_string(const char *src, char c, size_t n, int from_start) < size_t src_length = strlen(src); char *dest = malloc(n + src_length + 1); if (dest) < memcpy(dest + (from_start ? n : 0), src, src_length); memset(dest + (from_start ? 0 : src_length), c, n); dest[n + src_length] = 0; >return dest; > /* inline */char *pad_left(const char *src, char c, size_t n) < return _pad_string(src, c, n, 1); >/* inline */char *pad_right(const char *src, char c, size_t n)
Отслеживать
ответ дан 16 окт 2016 в 22:00
9,066 14 14 серебряных знаков 26 26 бронзовых знаков
#include #include int main(void) < char s[20]; int i; strcpy(s, "1234"); printf("before: \"%s\"\n", s); int l = strlen(s); int plus = 2; for (i = l; i >= 0; --i) // копируем строку смещая на plus позиций вперед s[i + plus] = s[i]; // включая завершающий '\0' for (i = 0; i < plus; ++i) // заполняем первые plus позиций s[i] = '0'; printf("after: \"%s\"\n", s); return 0; >
Позволю себе, спустя полгода, дополнить ответ. Абсолютно правильное решение дал @VladFromMoscow. Вообще, если задача решается с помощью функций стандартной библиотеки, правильно использовать стандартную библиотеку. Но (личное мнение), с методической точки зрения, бывает полезно написать собственный велосипед, дублирующий стандартный функционал. Просто для тогог, чтобы лучше понять, как все это работает "под капотом".
Как добавить символ в начало строки c

Все, что я хочу сделать, это если ввод, например: racket выход должен быть rarcket ,
Другими словами, каждый раз персонаж ‘a’ находится, программа должна добавить символ ‘r’ к этому.
Я думаю, что программа получает значение кода ASCII каждой буквы, а затем выполняет операцию сложения. Это дает мне какое-то странное письмо.
Решение
Вы должны использовать строка :: вставить .
Вот код, который будет работать для вашего примера:
Другие решения
Вы ничего не вставляете в свою строку. Вместо этого вы на самом деле называют += оператор элемент персонажа, не один из строка (который можно добавить только в конце в любом случае).
Что вы на самом деле хотите сделать, это вставить элемент в строку. Самый простой способ сделать это в вашем примере это что-то вроде замены
который вставляет ‘r’ за ‘a’ ты нашел.
Однако обратите внимание, что вставка символов таким способом может сделать недействительными любые итераторы в строке из-за возможного перераспределения. В вашем случае это не проблема, поскольку вы используете итерацию на основе индекса и проверяете (возможно, увеличенный) размер строки в каждой итерации, но об этом стоит помнить.
word.at(i) += ‘r’; меняет персонажа на позиции i к другому значению. это не вставка r в строку.
Если char является signed на вашей платформе, то в зависимости от вашего кодирование, поведение вашей программы не определено как добавление ‘r’ в ‘a’ может переполнить signed тип! ‘a’ а также ‘r’ просто числовые литералы из char тип. Это обозначение предоставлено для удобства, чтобы сделать код понятным и переносимым.
Если хотите вставить фактический персонаж затем использовать std::string::insert :
сделаю это, я позаботился о приращении i снова, чтобы пропустить только что добавленного персонажа.
Приведенный выше код не делает то, что вы думаете, он должен. Это добавляет числовое представление ‘a’ с ‘r’ и сохраняет его в индексе i , Предполагая, что результат вписывается в тип char на вашей платформе.
Вы можете std::string::insert в определенную позицию в строке, но его наверное лучше просто использовать новую строку: — Вы можете скопировать каждый символ строки в другую строку (добавив дополнительный символ на лету).
РЕДАКТИРОВАТЬ:
Как уже отмечалось, вышесказанное работает, потому что std::string перегружен += оператор для char
вставить после первого появления
вставлять после каждого вхождения
когда вы делаете
вы на самом деле меняете персонажа на позиции я к другому значению.
если вам нужно добавить / добавить строку по заданному индексу в объекте word, тогда выполните
Для начала вы должны включить заголовок эксплицитно
потому что в соответствии со стандартом C ++ не обязательно, чтобы заголовок включает в себя заголовок ,
Вы могли бы использовать метод insert класса std::string как другие предлагают. Однако этот подход неэффективен, потому что может быть много перемещений подстрок и перераспределений памяти, занятой строкой.
На мой взгляд, простой подход будет более эффективным.
Нужно записать несколько символов в начало строки.

3 ответа 3
Позволю себе, спустя полгода, дополнить ответ. Абсолютно правильное решение дал @VladFromMoscow. Вообще, если задача решается с помощью функций стандартной библиотеки, правильно использовать стандартную библиотеку. Но (личное мнение), с методической точки зрения, бывает полезно написать собственный велосипед, дублирующий стандартный функционал. Просто для тогог, чтобы лучше понять, как все это работает "под капотом".
Все можно сделать, используя стандартные C функции, объявленные в заголовке .
Вывод программы на консоль
Если строка не дополнена нулями, то копировать надо не strlen( string ) символов, а strlen( string ) + 1 символ.
То есть в общем случае правильно будет записать
Как в своем комментарии указал Pink Tux, в общем случае вы должны проверять, содержит ли исходный массив достаточно места, чтобы можно было сдвинуть вправо хранящуюся в нем строку.
У меня есть string , скажем, myStr = "My name is user something something";
Я хочу изменить эту строку на:
Я хочу преобразовать строку из:
Меня зовут пользователь что-то
"Меня зовут пользователь что-то"
Я пробовал несколько методов, но никто не работал, выглядит легко, но я чего-то не хватает. Можете ли вы сделать блок кода, который добавляет "’" символ начала и окончания строки. Спасибо.
Как добавить элемент в начало строки с
Все можно сделать, используя стандартные C функции, объявленные в заголовке .
Вывод программы на консоль
Если строка не дополнена нулями, то копировать надо не strlen( string ) символов, а strlen( string ) + 1 символ.
То есть в общем случае правильно будет записать
Как в своем комментарии указал Pink Tux, в общем случае вы должны проверять, содержит ли исходный массив достаточно места, чтобы можно было сдвинуть вправо хранящуюся в нем строку.
Заполнение строк в .NET
Перечисленные ниже методы класса String позволяют создать новую строку, состоящей из исходной строки, и дополнить ее указанными символами с начала или с конца до указанной общей длины. Символом заполнения может быть пробел или указанный знак. Итоговая строка выравнивается по правому или левому краю. Если длина исходной строки уже равна или превышает нужную общую длину, методы заполнения возвращают исходную строку без изменений; Дополнительные сведения см. в разделах Returns двух перегрузок методов и String.PadRight .
| Имя метода | Использовать |
|---|---|
| String.PadLeft | Дополняет строку до указанной общей длины знаками с начала. |
| String.PadRight | Дополняет строку до указанной общей длины знаками с конца. |
PadLeft
Метод String.PadLeft создает новую строку, присоединяя в начало исходной строки заполняющие символы в количестве, необходимом для достижения указанной общей длины. Метод String.PadLeft(Int32) в качестве заполняющих символов использует пробелы, а метод String.PadLeft(Int32, Char) позволяет задать любой заполняющий символ.
В следующем примере кода метод PadLeftиспользуется для создания новой строки длиной в двадцать символов. Этот пример выводит на консоль значение » ———Hello World! «.
PadRight
Метод String.PadRight создает новую строку, присоединяя в конец исходной строки заполняющие символы в количестве, необходимом для достижения указанной общей длины. Метод String.PadRight(Int32) в качестве заполняющих символов использует пробелы, а метод String.PadRight(Int32, Char) позволяет задать любой заполняющий символ.
В следующем примере кода метод PadRightиспользуется для создания новой строки длиной в двадцать символов. Этот пример выводит на консоль значение » Hello World!——— «.
Библиотеки и функции для работы со строками в си
Библиотека string.h предоставляет функции для работы со строками (zero-terminated strings) в си, а также несколько функций для работы с массивами, которые сильно упрощают жизнь. Рассмотрим функции с примерами.
Копирование
Копирует участок памяти из source в destination, размером num байт. Функция очень полезная, с помощью неё, например, можно скопировать объект или перенести участок массива, вместо поэлементного копирования. Функция производит бинарное копирование, тип данных не важен. Например, удалим элемент из массива и сдвинем остаток массива влево.
Функция меняет местами две переменные
Здесь хотелось бы отметить, что функция выделяет память под временную переменную. Это дорогостоящая операция. Для улучшения производительности стоит передавать функции временную переменную, которая будет создана один раз.
Копирует блок памяти из source в destination размером num байт с той разницей, что области могут пересекаться. Во время копирования используется промежуточный буфер, который предотвращает перекрытие областей.
Копирует одну строку в другую, вместе с нулевым символом. Также возвращает указатель на destination.
Можно копировать и по-другому
Копирует только num первых букв строки. 0 в конец не добавляется автоматически. При копировании из строки в эту же строку части не должны пересекаться (при пересечении используйте memmove)
Конкатенация строк
Добавляет в конец destination строку source, при этом затирая первым символом нулевой. Возвращает указатель на destination.
Добавляет в конец строки destination num символов второй строки. В конец добавляется нулевой символ.
Сравнение строк
Возвращает 0, если строки равны, больше нуля, если первая строка больше, меньше нуля, если первая строка меньше. Сравнение строк происходит посимвольно, сравниваются численные значения. Для сравнения строк на определённом языке используется strcoll
сравнение строк по первым num символам
Пример — сортировка массива строк по первым трём символам
Трансформация строки в соответствии с локалью. В строку destination копируется num трансформированных символов строки source и возвращается её длина. Если num == 0 и destination == NULL, то возвращается просто длина строки.
Поиск
Проводит поиск среди первых num байтов участка памяти, на который ссылается ptr, первого вхождения значения value, которое трактуется как unsigned char. Возвращает указатель на найденный элемент, либо NULL.
Возвращает указатель на место первого вхождения character в строку str. Очень похожа на функцию memchr, но работает со строками, а не с произвольным блоком памяти.
Возвращает адрес первого вхождения любой буквы из строки str2 в строке str1. Если ни одно включение не найдено, то возвратит длину строки.
Пример — найдём положение всех гласных в строке
Здесь обратите внимание на строку i++ после printf. Если бы её не было, то strcspn возвращал бы всегда 0, потому что в начале строки стояла бы гласная, и произошло зацикливание.
Для решения этой задачи гораздо лучше подошла функция, которая возвращает указатель на первую гласную.
Функция очень похожа на strcspn, только возвращает указатель на первый символ из строки str1, который есть в строке str2. Выведем все гласные в строке
Возвращает указатель на последнее вхождение символа в троку.
Возвращает длину куска строки str1, начиная от начала, который состоит только из букв строки str2.
Пример — вывести число, которое встречается в строке.
Возвращает указатель на первое вхождение строки str2 в строку str1.
Разбивает строку на токены. В данном случае токенами считаются последовательности символов, разделённых символами, входящими в группу разделителей.
Ещё функции
Самая популярная функция
Возвращает длину строки — число символов от начала до первого вхождения нулевого.
Конверсия число-строка и строка-число.
Переводит строку в целое
Переводит строку в число типа double.
Переводит строку в число типа long Все функции такого рода имеют название XtoY, где X и Y — сокращения типов. A обозначает ASCII. Соответственно, имеется обратная функция itoa (больше нет:)). Таких функций в библиотеке stdlib.h очень много, все их рассматривать не хватит места.
Форматированный ввод и вывод в буфер
Можно также выделить две функции sprintf и sscanf. Они отличаются от printf и scanf тем, что выводят данные и считывают их из буфера. Это, например, позволяет переводить строку в число и число в строку. Например
Вообще, работа со строками — задача более глобальная, чем можно себе представить. Так или иначе, практически каждое приложение связано с обработкой текста.
Работа с локалью
Устанавливает локаль для данного приложения. Если locale равно NULL, то setlocale может быть использована для получения текущей локали.
Локаль хранит информацию о языке и регионе, специфичную для работы функций ввода, вывода и трансформации строк. Во время работы приложения устанавливается локаль под названием «C», которая совпадает с настройками локали по умолчанию. Эта локаль содержит минимум информации, и работа программы максимально предсказуема. Локаль «C» также называется «». Константы category определяют, на что воздействует изменение локали.
Значения параметра category
Строка locale содержит имя локали, например «En_US» или «cp1251»

Всё ещё не понятно? – пиши вопросы на ящик