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




функции strlen (), strcat (), strcpy (), strcmp () в C++

После того, как мы с вами познакомились со строками и символьными массивами в C++, рассмотрим самые распространённые функции для работы с ними. Урок будет полностью построен на практике. Мы будем писать собственные программы-аналоги для обработки строк и параллельно использовать стандартные функции библиотеки cstring (string.h – в старых версиях). Так вы примерно будете себе представлять, как они устроены. К стандартным функциям библиотеки cstring относятся:

  • strlen() – подсчитывает длину строки (количество символов без учета \0);
  • strcat() – объединяет строки;
  • strcpy() – копирует символы одной строки в другую;
  • strcmp() – сравнивает между собой две строки .

Это конечно не все функции, а только те, которые мы разберём в этой статье.

strlen() (от слова length – длина)

Наша программа, которая подсчитает количество символов в строке:

Для подсчёта символов в строке неопределённой длины (так как вводит её пользователь), мы применили цикл while – строки 13 – 17. Он перебирает все ячейки массива (все символы строки) поочередно, начиная с нулевой. Когда на каком-то шаге цикла встретится ячейка ourStr [amountOfSymbol], которая хранит символ \0, цикл приостановит перебор символов и увеличение счётчика amountOfSymbol.

Так будет выглядеть код, с заменой нашего участка кода на функцию strlen():

Как видите, этот код короче. В нем не пришлось объявлять дополнительные переменные и использовать цикл. В выходном потоке cout мы передали в функцию строку – strlen(ourStr). Она посчитала длину этой строки и вернула в программу число. Как и в предыдущем коде-аналоге, символ \0 не включен в общее количество символов.

Результат будет и в первой программе и во второй аналогичен:

функция strlen () в C++

strcat() (от слова concatenation – соединение)

Программа, которая в конец одной строки, дописывает вторую строку. Другими словами – объединяет две строки.

По комментариям в коде должно быть всё понятно. Ниже напишем программу для выполнения таких же действий, но с использованием strcat(). В эту функцию мы передадим два аргумента (две строки) – strcat(someText1, someText2); . Функция добавит строку someText2 к строке someText1. При этом символ '\0' в конце someText1 будет перезаписан первым символом someText2. Так же она добавит завершающий '\0'

Реализация объединения двух строк, используя стандартную функцию, заняла одну строчку кода в программе – 14-я строка.

Результат:

strcat c++, strcat_s c++

На что следует обратить внимание и первом и во втором коде – размер первого символьного массива должен быть достаточным для помещения символов второго массива. Если размер окажется недостаточным – может произойти аварийное завершение программы, так как запись строки выйдет за пределы памяти, которую занимает первый массив. Например:

В этом случае, строковая константа “Учите С++ c нами!” не может быть записана в массив someText1. В нём недостаточно места, для такой операции.

Если вы используете одну из последних версий среды разработки Microsoft Visual Studio, возможно возникновение следующей ошибки: “error C4996: ‘strcat’: This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.” Так происходит потому, что уже разработана новая более безопасная версия функции strcat – это strcat_s. Она заботится о том, чтобы не произошло переполнение буфера (символьного массива, в который производится запись второй строки). Среда предлагает вам использовать новую функцию, вместо устаревшей. Почитать больше об этом можно на сайте msdn. Подобная ошибка может появиться, если вы будете применять функцию strcpy, о которой речь пойдет ниже.

strcpy() (от слова copy – копирование)

Реализуем копирование одной строки и её вставку на место другой строки.

Применим стандартную функцию библиотеки cstring:

Пробуйте компилировать и первую, и вторую программу. Увидите такой результат:

strcpy c++

strcmp() (от слова compare – сравнение)

Эта функция устроена так: она сравнивает две Си-строки символ за символом. Если строки идентичны (и по символам и по их количеству) – функция возвращает в программу число 0. Если первая строка длиннее второй – возвращает в программу число 1, а если меньше, то -1. Число -1 возвращается и тогда, когда длина строк равна, но символы строк не совпадают.

strcmp c++ Программа с strcmp():

strcmp c++

Делитесь в социальных сетях нашими статьями со своими знакомыми, которые так же изучают основы программирования на языке С++.

На нашем сайте уже есть возможность оформить подписку, чтобы получать уведомления о новых статьях. Чтобы подписаться – впишите свой e-mail ниже.

Рассылка новых уроков по программированию:

Функции для работы со строками в C++
4.3 (86.67%) 12 votes

Функции для работы со строками в C++: 28 комментариев

  1. Здравствуйте. Скажите пожалуйста, почему когда объединяем две строки и второму символьному массиву задаем длину массива, например

    , то в этом случае второй массив не объединяется с первым?

    1. Это неправда.
      У вас результат может просто не помещаться в someText1[].
      Увеличьте его размер – чего жадничать?
      Например: someText1[ 200 ]

  2. Объясните, пожалуйста, почему в примере с объединением строк
    int count1 = 0; // для индекса ячейки где хранится ‘\0’ первой строки
    while (someText1[count1] != 0)
    мы пишем “someText1[count1] != 0” а не “someText1[count1] != ‘\0′”?
    Мы же вроде бы ищем элемент окончания символьной строки ‘\0’? При чем здесь ноль?
    Хотя должен заметить, у меня а Коудблоксе работает и с нулем…

    1. Потому что запись ‘\0’ как-раз и означает: байт, численное значение записанное в который равно 0.
      Такие записи эквивалентны.

  3. Уважаемый автор!
    По-моему, в первом примере сравнений строк пропущена директива препроцессору #include

  4. Чета не могу понять
    char xsmibol[2] = {wParam, ‘\0’};
    вот так работает
    ————————–
    А вот так не работает:
    char xsmibol[2];
    xsmibol = {wParam, ‘\0’};

    Говорит 17 27 C:\Users\1\Documents\main1.cpp [Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11
    17 12 C:\Users\1\Documents\main1.cpp [Error] assigning to an array from an initializer list
    37 14 C:\Users\1\Documents\main1.cpp [Error] expected primary-expression before ‘)’ token

    Что я делаю не так ?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *