Основы программирования на С++ для начинающих

Функции для работы со строками в 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++

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

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

  1. while (true) // запускаем бесконечный цикл
    {
    someText1[count] = someText2[count]; // копируем посимвольно
    if (someText2[count] == ‘\0’) // если нашли \0 у второй строки
    {
    break; // прерываем цикл
    }
    count++;
    }
    Мне не понятно куда делась остальная часть строки “Сaйт purecodecpp.com!” ,
    если по идее должно получиться так: Основы С++pp.com.
    Мы копируем посимвольно меньшую строку в большую, так почему остаток someText1 удаляется?

    1. Потому, что мы копируем не меньшую в большую, а вторую в первую. И когда подойдет ‘\0’ во второй строке он тоже перезапишется в первый массив. Далее, когда будет считываться первый массив, то этот ноль и покажет конец строки и не важно, что там было за ним записано. Это будет конец строки.

  2. #include
    #include
    using namespace std;

    int main()
    {
    setlocale(LC_ALL, “rus”);

    char string_Array_1[] = “Вася, ты что, устал?”;
    char string_Array_2[] = “Вася, ты что, устал!”;

    cout << "Первая строка – \"" << string_Array_1 << "\"\n";
    cout << "Вторая строка – \"" << string_Array_2 << "\"\n";
    cout << "=====================================================\n\n";
    cout << "Если строки идентичны и по символам и по количеству, то: 0\n";
    cout << "Если первая строка длиннее второй, то: +1\n";
    cout << "Если первая строка короче второй, то: -1\n";
    cout << "Если длина строк равна, но символы не совпадают, то: -1\n";
    cout << "=====================================================\n\n";
    cout << "В приведенном случае получился ответ: " << strcmp(string_Array_1 , string_Array_2);
    cout << endl << endl;

    return 0;
    }

    Получатся:

    Первая строка – "Вася, ты что, устал?"
    Вторая строка – "Вася, ты что, устал!"
    ==========================================================

    Если строки идентичны и по символам и по количеству, то: 0
    Если первая строка длиннее второй, то: +1
    Если первая строка короче второй, то: -1
    Если длина строк равна, но символы не совпадают, то: -1
    ===========================================================

    В приведенном случае получился ответ: 1

    Не могу понять, почему 1, если в концах строк разные символы: ? и !

    1. Интересный баг в этом коде.
      Скопировал, сделал два одинаковых текста “Вася, ты что, устал!” в char string_Array_1[] и char string_Array_2[] и проверил:
      1. Пока строки одинаковы то всё GOOD!!!
      2. Если первую строку сделать длиннее то получаю ” -1 ” (инвертировано).
      3. Если первую строку сделать короче то получаю ” 1 ” (инвертировано).
      Дальше интереснее.
      4. Если в первой строке в слове ” устал ” букву ” у ” поменять на ” т ” то получаю ” -1 ”
      5. Если в первой строке в слове ” устал ” букву ” у ” поменять на ” ф ” то получаю ” 1 ”
      6. Если во второй строке в слове ” устал ” букву ” у ” поменять на ” т ” то получаю ” 1 ”
      7. Если во второй строке в слове ” устал ” букву ” у ” поменять на ” т ” то получаю ” -1 ”
      Слово ” устал ” я взял для примера. Букву ” у ” я менял на предыдущую и следующую в алфавите. Это работает с любой заменой букв ( ” а ” и ” я ” я не смог поменять).

      1. Это не баг (как я думал). Это связано с кодировкой ASCII. Саму кодировку ASCII можно загуглить. Вот и выходит что “у” по этой кодировке больше “т” и меньше “ф”

    1. Чем больше код символа в таблице ASCII тем “длиннее”.
      “B” длиннее “А”, а “D” длиннее “B”.
      Знаков препинания это тоже касается.
      У “!” код 33, а у “?” код 63, значит ? > !

      1. Да, немного разобравшись я понял (догадался) что тут идёт привязка к кодировке ASCII

      2. Предположу что функция просто складывает все числа и сравнивает сумму 1 строки с суммой 2.
        Заменил строки
        “AaaaaAaaaaAaaaaAaaaaAaaaaAaaaa”
        “ZzzzzZzzzzZzzzzZzzzzZzzzzZzzz”
        ответ был -1
        несмотря на то что 1 строка длиннее. Ну я имею право ошибаться :))

  3. >>Да, немного разобравшись я понял (догадался) что тут идёт привязка к >>кодировке ASCII
    Никакой “привязки” к кодировке нет, сравниваются числа, для процессора не существует ни кодировок ни символов, а есть только числа и то в двоичной системе счисления!

  4. Добрый день. У меня вопрос. Как можно записать введенный с консоли текст в массив, не объявляя его заранее. К примеру, если мы не знает размер строки, которую введет пользователь, но и не хотим заранее объявлять пустой массив
    со случайным размером (вдруг мы укажем меньший размер, чем тот который нужен.).Получается что пользователь вводит строку, нажимает ввод и далее, должен создаться массив подходящий для хранения этого набора символов.

      1. Можете помочь? Как записать текст в матрицу по строкам и затем переписать её от центра по спирали?

Добавить комментарий для Ол Отменить ответ

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