Как правильно сравнивать строки?
char input[40];
char check[40];
strcpy(input, "Hello"); // input assigned somehow
strcpy(check, "Hello"); // check assigned somehow
// insufficient
while (check != input)
// good
while (strcmp(check, input) != 0)
// or
while (strcmp(check, input))
Давайте копнем глубже, чтобы понять, почему check != input
недостаточно.
В языке C строка - это спецификация стандартной библиотеки.
строка - это непрерывная последовательность символов, которая заканчивается первым нулевым символом и включает его.
C11 §7.1.1 1
input
выше не является строкой. input
- это массив 40 символов.
Содержимое input
может стать строкой.
В большинстве случаев, когда в выражении используется массив, он преобразуется в адрес его 1-го элемента.
Ниже показано преобразование check
и input
в соответствующие адреса первого элемента, затем эти адреса сравниваются.
check != input // Compare addresses, not the contents of what addresses reference
Чтобы сравнить строки, нам нужно использовать эти адреса, а затем просмотреть данные, на которые они указывают.
strcmp()
выполняет свою работу. §7.23.4.2
int strcmp(const char *s1, const char *s2);
Функция strcmp
сравнивает строку, на которую указывает s1
, со строкой, на которую указывает s2
.
Функция strcmp
возвращает целое число, большее, равное или меньшее нуля, соответственно, поскольку строка, на которую указывает s1
, больше, равна или меньше строки, на которую указывает s2
.
Код может не только определить, принадлежат ли строки к одним и тем же данным, но и определить, какая из них больше / меньше, если они различаются.
Нижеследующее верно, когда строки различаются.
strcmp(check, input) != 0
Для получения дополнительной информации см. Создание моей собственной strcmp()
функции
person
chux - Reinstate Monica
schedule
10.01.2019
gets( )
был удален из стандарта. Вместо этого используйтеfgets( )
. - person Edward Karak   schedule 29.01.2015strcmp()
возвращает ноль, когда его входные данные равны, объясняет, как сравнивать строки на равенство, неравенство, меньше, больше, меньше или равно и больше или равно. Не все сравнения строк предназначены для равенства. Сравнение с учетом регистра снова отличается; другие специальные сравнения (например, порядок словаря) требуют более специализированных компараторов, и есть регулярные выражения для еще более сложных сравнений. - person Jonathan Leffler   schedule 23.11.2016gets()
нельзя. Он также был удален из стандарта, начиная с C11 - ›Пожалуйста, прочтите Почему функция gets настолько опасна, что ее не следует использовать? - person RobertS supports Monica Cellio   schedule 30.05.2020