Функції для роботи з рядками в 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:

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

зЬгсру C ++

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

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

зЬгстр C ++ програма з strcmp():

зЬгстр C ++

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

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

Нові уроки з програмування:

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

28 думки про "Функції для роботи з рядками в C++

  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. Подружжя не можу зрозуміти
    голець xsmibol[2] = {WPARAM, « 0»};
    ось так працює
    ————————–
    А ось так не працює:
    голець xsmibol[2];
    xsmibol = {WPARAM, « 0»};

    каже 17 27 C:\Users 1 Documents main1.cpp [УВАГА] розширені списки ініціалізатор доступні тільки з -std = C ++ 11 або -std = гну ++ 11
    17 12 C:\Users 1 Documents main1.cpp [помилка] призначаючи на масив зі списку ініціалізаторів
    37 14 C:\Users 1 Documents main1.cpp [помилка] очікується, первинне вираження, перш ніж «)’ знак

    Що я роблю не так ?

залишити коментар

Ваша електронна адреса не буде опублікований. Обов'язкові поля позначені * *