Как правильно сравнивать строки?
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 строка - это стандартная спецификация библиотеки.
A строка - это непрерывная последовательность символов, оканчивающаяся на первый нулевой символ включительно
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()
функции