Как склеить строки в си

от admin

Функции для работы со строками

Данная функция возвращает целое число – длину строки, которая ей передана в качестве аргумента.

Обратите внимание. Длина строки – это не количество элементов символьного массива, а количество элементов в массиве до первого нуль-символа. Например, следующий код выведет на экран не 19 , а 7 .

Рис.1 Работа функции strlen.

Функция склеивания строк strcat.

Данная функция склеивает строки, которые передаются ей в качестве параметров. Функция strcat присоединяет к концу строки str1 строку str2 .

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

Результат работы этой программы ниже:

Работа функции strcat.

Рис.2 Работа функции strcat.

Функция сравнения строк strcmp

Данная функция сравнивает посимвольно строки, переданные ей в качестве аргументов. Функция strcmp вернёт нуль, если строки равны между собой, иначе какое-либо другое целое число (положительное или отрицательное). Общее правило таково: Если в функции strcmp() первая строка больше, чем вторая строка, то функция возвращает положительное число. Если меньше – отрицательное. Сравнение осуществляется по кодам символов в таблице ASCII

Посмотрите на пример.

Работа функции strcmp.

Рис.3 Работа функции strcmp.

Первая и вторая строки одинаковы, поэтому результат их сравнения нуль. А вот первая и третья строки различаются седьмым символом. В первой строке это строчная w , а в третьей – прописная W . Т.к. код строчной буквы w больше, чем код прописной буквы W (119 > 87) , то в n13 помещается положительное число, т.к. первая строка, больше второй. Теперь если мы поменяем строки местами, то получим отрицательное число.

Функция копирования строк strcpy.

Данная функция принимает на вход две строки, а потом копирует вторую строку в первую. Простой примерчик.

Работа функции strcpy.

Рис.4 Работа функции strcpy.

Как и в случае с strcat программисту нужно самому следить за тем, чтобы в первой строке хватило места для копирования в неё второй строки.

Есть и более сложные функции работы со строками, но о них в базовой части курса мы говорить не будем.

Сохрани в закладки или поддержи проект.

Практика

Решите предложенные задачи:

Для удобства работы сразу переходите в полноэкранный режим

Как правильно склеить две строки в Си?

Проблема в том, что функция strcat не выделяет память, а копирует из одной строки в другую. Поскольку длина первой строки меньше, чем длина второй, то память перетирается. Нужно изменить код, например, так.

Чтобы склеить 2 строки в Си, нужно выполнить следующие действия:

При помощи функции malloc выделить блок памяти ( result ), достаточный для сохранения в него обеих строк (и не забыть про место, для завершающего нуля)

При помощи функции memcpy скопировать первую строку s1 в начало выделенного блока

При помощи всё той же функции memcpy скопировать вторую строку s2 , вместе с её нулём, в выделенный блок, со смещением на размер первой строки

После того, как вы совершили какие-то манипуляции с полученной строкой, её нужно освободить, при помощи функции free

Для strcat первый аргумент должен указывать на буфер достаточной длины, чтобы в него могла поместиться итоговая (склеенная) строка. Переменные first и second являются указателями на строковые литералы, т.е. данные по таким указателям изменять нельзя. Это приводит к неопределенному поведению (UB).

Исходный пример может быть переписан следующим образом:

Самый простой вариант — явно зарезервировать под первую строку (к которой будет «приклеиваться» вторая строка) памяти с запасом:

Если содержимое строк известно на этапе компиляции, то и склеивание можно организовать на этапе компиляции

Но это уж зависит от того, что именно вам нужно.

Для склеивания во время выполнения использовать функцию strcat — не самая лучшая идея из-за того, что при каждом склеивании функция снова и снова выполняет сканирование уже построенной части строки. (По этой причине strcat — фактически бесполезная функция.) Лучше уж воспользоваться для этих целей обычным snprintf

А уж какой способ резервирования памяти для строки-получателя вам больше подходит — зависит от ваших конкретных обстоятельств и требований.

Раз уж пошло такое массовое отвечание некропоста, то внесу и свою лепту.

В GNU есть очень удобный аналог sprintf — asprintf, которая размещает результат «вывода» своих аргументов в динамической памяти (использует malloc).

Соответственно, программа может быть такой:

А если у вас ее (asprintf) нет, то несложно и самому написать

(или скопипастить) и использовать уже без всяких #define _GNU_SOURCE даже в винде (по крайней мере MinGW успешно транслирует).

  1. Выделяем нужное количество памяти
  2. Склеиваем и возвращаем указатель на начало блока памяти.

Потому что функция strcat() добавляет

    строку, на которую указывает второй параметр ( «second» )
Читать:
Как обойти перманентный бан в тс

к строке, на которую указывает первый параметр ( «first» )

и затем вращает первый параметр — указатель на первую строку, но к которой теперь добавлена и вторая строка,

нужно для первого параметра выделить достаточную память для соединенной строки ( «firstsecond» ) — или во время компиляции, или динамически.

Как склеить строки в си

Заголовочный файл string.h содержит ряд функций для работы со строками. Рассмотрим некоторые из них.

Длина строки. strlen

Функция strlen() возвращает количество символов строки (без учета концевого нулевого байта). Функция имеет следующее описание:

То есть в качестве параметра принимает строку, длину которой надо найти. А результатом является значение size_t — данный тип представляет целое положительное число, который определен специально для представления размера.

Найдем длину строки:

Для вывода на консоль значения size_t применяется спецификатор %zu .

Сравнение строк. strcmp

Для сравнения строк применяется функция strcmp() , которая имеет следующий прототип:

Функция принимает две строки и посимвольно сравнивает их. Результатом функции является целое число. Функция посимвольно сравнивает строки, и . . Если

если строки равны, то возвращается 0

Если первый несовпадающий символ первой строки идет в лексикографическом порядке до символа второй строки, то возвращается число меньше 0

Если первый несовпадающий символ первой строки идет в лексикографическом порядке после символа второй строки, то возвращается число больше 0

Сравним пару строк:

Объединение строк. strcat

Функция strcat объединяет две строки в одну. Она имеет следующий прототип:

Функция добавляет строку source_str к строке destination_str . При этом первая строка должна быть достаточно большая, чтобы вместить вторую строку:

Копирование строк. strcpy

Функция strcpy копирует символы из одной строки в другую. Она имеет следующий прототип:

Функция копирует символы из строки source_str в destination_str . При этом первая строка должна иметь достаточную длину, чтобы вместить вторую.

Скопируем символы из одной строки во вторую:

Стоит отметить, что эта функция копирует символы из source в destination, пока не встретит нулевой байт \0. Теоретически это может приводить к переполнению буфера. И для избежания этой проблемы есть другая функция — strncpy , которая в качестве третьего параметра принимает количество копируемых символов:

Однако функция strncpy имеет другую проблему — скопированная строка НЕ заканчивается нулевым байтом, что опять же в будущем может привести к переполению буфера. Поэтому после копирования следует вручную устанавливать нулевой байт:

Кроме того, можно использовать функцию strncpy_s , которая считается более безопасной:

Эта функция принимает дополнительные параметры — destmax — максимальное количество копируемых символов в буфер destination и srcmax — максимальное количество копируемых символов из строки source. В качестве результата функция возвращает информацию об ошибке:

Поиск в строке подстроки. strstr

Функция strstr ищет в строке определенную подстроку. Она имеет следующий прототип:

Функция ищет подстроку substring в строке string и возвращает указатель на символ первого вхождения подстроки, то есть по сути адрес подстроки. Если от адреса первого символа строки вычесть адрес первого входжения подстроки, то мы получим индекс подстроки в строке:

Как склеить строки в си

char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);

ОПИСАНИЕ

Функция strncat() работает аналогичным образом, но

* задействует не более n первых байт строки src и * строка src может не завершаться байтом null, если в ней содержится n или более байт.

Как и strcat(), строка-результат в dest всегда заканчивается байтом null.

Если в src содержится n или более байт, то strncat() записывает n+1 байт в dest (n из src плюс завершающий байт null). Поэтому размер dest должен быть не менее strlen(dest)+n+1.

Простейшей реализацией strncat() может быть:

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
strcat(), strncat() безвредность в нитях безвредно (MT-Safe)

СООТВЕТСТВИЕ СТАНДАРТАМ

ЗАМЕЧАНИЯ

size_t strlcat(char *dest, const char *src, size_t size);

Эта функция добавляет строку src, оканчивающуюся null, к строке dest, копируя не более size-strlen(dest)-1 байт из src, и добавляет к результату конечный байт null, если size менее strlen(dest). Эта функция исправляет проблему с переполнением буфера в strcat(), но вызывающий по прежнему должен рассматривать возможность потери данных, если size слишком мал. Функция возвращает длину строки, которую strlcat() пыталась создать; если возвращаемое значение больше или равно size, то произошла потеря данных. Если потеря данных критична, то вызывающий должен или проверять аргументы перед вызовом, или проверять возвращаемое функцией значение. Функция strlcat() отсутствует в glibc и не стандартизована POSIX, но доступна в Linux в библиотеке libbsd.

Похожие статьи