3 способи порівняння рядків у C++

Вступні зауваження

Операція порівняння рядків є однією з базових і найчастіше використовуваних у програмуванні. У мові C++ існує декілька підходів для порівняння текстових рядків, кожен з яких характеризується своїми специфічними особливостями та сферою застосування. У цій статті ми детально розглянемо три основні способи порівняння рядків у C++:

  • Використання оператора рівності (==)
  • Застосування функції strcmp()
  • Застосування функції atol()

1. Порівняння з використанням оператора рівності (==)

Оператор == призначений для перевірки ідентичності двох рядків. Він повертає значення true, якщо рядки ідентичні, і false у протилежному випадку.

Розглянемо наступний приклад, де порівнюються два рядки:

#include <iostream>
#include <string>

using namespace std;

int main() {
  string str1 = "Привіт";
  string str2 = "Привіт";

  if (str1 == str2) {
    cout << "Рядки ідентичні" << endl;
  } else {
    cout << "Рядки відрізняються" << endl;
  }

  return 0;
}

Результатом виконання цього фрагмента коду буде вивід:

Рядки ідентичні

Важливо відзначити, що оператор == виконує порівняння, базуючись на ідентичності адрес рядків, а не на їх змісті. Це означає, що він може повернути true, навіть якщо вміст рядків різний, але вони займають один і той же сегмент пам’яті. Для порівняння саме вмісту рядків слід використовувати функції strcmp() або atol().

2. Застосування функції strcmp()

Функція strcmp() здійснює порівняння двох рядків і повертає ціле значення, що відображає результат порівняння:

  • Значення 0 – якщо рядки повністю ідентичні.
  • Від’ємне значення – якщо перший рядок лексично менший за другий.
  • Додатне значення – якщо перший рядок лексично більший за другий.

Нижче наведено приклад використання strcmp() для порівняння двох рядків:

#include <iostream>
#include <cstring>

using namespace std;

int main() {
  string str1 = "Hello";
  string str2 = "World";

  int result = strcmp(str1.c_str(), str2.c_str());

  if (result == 0) {
    cout << "Рядки ідентичні" << endl;
  } else if (result < 0) {
    cout << "Перший рядок менший за другий" << endl;
  } else {
    cout << "Перший рядок більший за другий" << endl;
  }

  return 0;
}

Результатом виконання даного коду буде наступний вивід:

Перший рядок менший за другий

Слід пам’ятати, що функція strcmp() є чутливою до регістру символів, тобто “Hello” і “hello” будуть розцінюватися як різні рядки.

3. Використання функції atol()

Функція atol() призначена для конвертації рядка в числове значення типу long. Її можна також застосувати для порівняння рядків, але лише в тому випадку, коли вони містять виключно цифри.

Розглянемо приклад порівняння двох рядків, що представляють числові значення, за допомогою atol():

#include <iostream>
#include <cstdlib>

using namespace std;

int main() {
  string str1 = "123";
  string str2 = "456";

  long num1 = atol(str1.c_str());
  long num2 = atol(str2.c_str());

  if (num1 == num2) {
    cout << "Рядки ідентичні" << endl;
  } else if (num1 < num2) {
    cout << "Перший рядок менший за другий" << endl;
  } else {
    cout << "Перший рядок більший за другий" << endl;
  }

  return 0;
}

Вивід цього коду буде:

Перший рядок менший за другий

Функція atol() не враховує регістр символів, тому “123” і “123” будуть вважатися ідентичними рядками.

Підсумки

У цій статті ми вивчили три основні способи порівняння текстових рядків у C++. Кожен із розглянутих методів має свої переваги та недоліки, тому вибір залежить від конкретної ситуації та поставлених завдань.

Оператор == є найбільш простим для використання, але він порівнює рядки за їхніми адресами, а не за змістом. Функція strcmp() дозволяє порівнювати рядки за змістом, але враховує регістр. Функція atol() може застосовуватися для порівняння рядків, що містять числа, і вона не чутлива до регістру.

Часті запитання (FAQ)

1. Який метод є найкращим для порівняння рядків у C++?

Вибір найкращого способу порівняння рядків залежить від конкретної задачі. Оператор == простий, але не завжди надійний для перевірки вмісту. strcmp() є більш надійним, але чутливий до регістру. atol() підходить для рядків з числами, не враховуючи регістру.

2. Як порівняти рядки, ігноруючи регістр?

Для порівняння рядків без урахування регістру використовуйте функцію strcasecmp(), яка аналогічна strcmp(), але не є чутливою до регістру.

3. Як порівнювати рядки з пробілами?

Для порівняння рядків, що містять пробіли, можна застосовувати strcmp() або atol(). Важливо пам’ятати, що strcmp() враховує пробіли, тоді як atol() – ні.

4. Чи можна порівнювати рядки зі спеціальними символами?

Так, для цього можна використовувати strcmp() або atol(). strcmp() враховує спеціальні символи, а atol() – ні.

5. Як порівнювати рядки, що містять числа та текст?

Для порівняння рядків, де є і числа, і текст, можна використовувати strcmp(). atol() перетворює весь рядок на число.

6. Що робити, якщо рядки мають різну довжину?

Для порівняння рядків різної довжини підходять strcmp() та atol(). strcmp() додає нулі до коротшого рядка, а atol() намагається перетворити весь рядок на число.

7. Як працювати з рядками, що містять нульові символи?

Функція strcmp() зупиняє порівняння при зустрічі з нульовим символом, а atol() – перетворює весь рядок на число.

8. Чи враховує порівняння кодування символів?

Функція strcmp() враховує кодування, а atol() – ні.

9. Як порівнювати рядки з великими та малими літерами?

Функція strcmp() чутлива до регістру, а atol() – ні.

10. Які ще є способи порівняння рядків?

Існують інші методи, такі як strcoll() для порівняння з урахуванням локалі, а також використання std::string і його методів для зручнішого порівняння рядків.