1. Сравнение char со строкой в кавычках в C++
C++ поддерживает два типа строковых представлений:
- Строки символов в стиле C
- Класс string представленный со стандартным C++.
Строка символов в стиле C возникла в языке C и продолжает поддерживаться в C++. Эта строка на самом деле является одномерным массивом символов, который заканчивается нулевым символом '\0'. Таким образом, строка с нулевым символом в конце содержит символы, которые составляют строку, за которой следует ноль.
Следующее объявление и инициализация создают строку, состоящую из слова «Hello». Чтобы содержать нулевой символ в конце массива, размер массива символов, содержащего строку, на один больше, чем количество символов в слове «Hello».
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
Если вы следуете правилу инициализации массива, вы можете написать приведённое выше утверждение следующим образом:
char greeting[] = "Hello";
Итак, char может использоваться для хранения строк наравне с экземплярами класса string, которые также хранят строки. Но тип char, как мы только что рассмотрели, являются не совсем обычными строками и в некоторых ситуациях они ведут себя не совсем так, как мы интуитивно ожидаем. Рассмотрим следующий пример кода:
#include <iostream> using namespace std; int main () { char first_string[] = "sum"; if (first_string == "sum") { cout << "Строки равны!" << endl; } }
Интуитивно представляется, что должна быть выведена надпись «Строки равны!», но на практике этого не происходит, то есть условие first_string == "sum" является false.
Объяснение: в C строка — это указатель на область памяти, которая содержит байты. Сравнение char* с char* с использованием оператора равенства не будет работать должным образом, потому что вы сравниваете места в памяти строк, а не их байтовое содержимое.
2. Сравнение char и string в C++
Первый способ решения указанной проблемы сравнения char — это сравнивать её не со строкой в кавычках, а с экземпляром класса string, то есть переменной, являющейся string.
Следующий код отработает так, как ожидается:
#include <iostream> #include <string> using namespace std; int main () { char first_string[] = "sum"; string second_string = "sum"; if (first_string == second_string) { cout << "Строки равны!" << endl; } }
Будет выведено:
Строки равны!
3. Конвертация char и string в C++
При присвоении значения char переменной типа string, она конвертируется в string — при этом даже не нужно использовать специальные функции — это происходит автоматически. А переменные типа string ведут себя более интуитивно предсказуемо (так, как мы привыкли в других языках программирования), в следующем коде значение переменной char мы присваиваем строке и уже эту строку сравниваем с "sum":
#include <iostream> #include <string> using namespace std; int main () { char first_string[] = "sum"; string real_string = first_string; if (real_string == "sum") { cout << "Строки равны!" << endl; } }
В результате будет выведено:
Строки равны!
4. Сравнение char в функции strcmp()
Функция strcmp() будет перебирать обе строки, проверяя их байты, чтобы увидеть, равны ли они. strcmp() вернёт 0, если они равны, и ненулевое значение, если они различаются.
Обратите внимание, что в следующем коде нам не нужно использовать заголовок #include <string>, но мы используем заголовок #include <cstring>, поскольку он содержит функцию strcmp:
#include <iostream> #include <cstring> using namespace std; int main () { char first_string[] = "sum"; if (strcmp(first_string, "sum") == 0) { cout << "Строки равны!" << endl; } }
В результате будет выведено «Строки равны!».
Выводы
char нельзя непосредственно сравнивать со строкой в кавычках, поскольку это даст неправильный результат. char можно сравнивать с переменной типа string, либо присвоить значение переменной типа string и затем сравнить со строкой в кавычках, либо можно использовать функцию strcmp для сравнения char со строкой в кавычках.
Смотрите также онлайн учебник «Основы С++».
Связанные статьи:
- Как ввести в cin строки с пробелами в С++ (100%)
- Почему в C++ для double в числе только 5 цифр после запятой (85.7%)
- Доступ к аргументам командной строки в C++ (85.7%)
- Как записать символы строки в обратном порядке (64.3%)
- Как в Bash проверить, содержит ли строка подстроку (64.3%)
- Ошибки «install_driver(CSV) failed: Can't locate DBD/CSV.pm in @INC» и «Can't locate Text/CSV.pm in @INC» (РЕШЕНО) (RANDOM - 50%)