Проверка char с помощью if
Я действительно не знаю почему, но это не похоже на работу. Кажется полностью действительным для меня:
gchar *text = gtk_entry_get_text(entry);
if(text == "hello") {
//do sth
}
else {
//do sth else
}
Даже когда я набираю hello, ничего не происходит, но вызывается код в else { }. В чем проблема?
8 ответов
В C строковые литералы - это массивы, которые во многих ситуациях становятся указателями. Что вы сравниваете, когда используете ==
это адреса строк (или, скорее, адреса первых символов каждой строки), а не содержимое строки, как вы ожидаете. Например:
if (text == "hello")
Это вроде как делать:
if (0x800050a0 == 0x80001000)
Вряд ли text
указывает на то же место, где хранятся символы для "hello"
,
Чтобы сравнить строку в C, вы должны использовать strcmp
, который возвращает целое число в зависимости от того, как строки сравниваются друг с другом. Если строки равны, функция возвращает 0. Если первая строка лексикографически меньше, чем вторая строка, то функция возвращает -1, в противном случае функция возвращает 1.
Вы должны сравнивать строки, используя strcmp
:
if(strcmp(text, "hello") == 0) {
//do sth
}
else {
//do sth else
}
То, что вы делаете, сравнивает два указателя. Читать дальше
Ваша программа сравнивает указатели строк text
а также "hello"
, он не сравнивает строки символ за символом.
(другие респонденты демонстрируют средства для сравнения персонажей)
Ваш код сравнивает указатели, и они явно не равны. Вы хотите сравнить строки, поэтому вам, вероятно, нужно сделать что-то вроде:
if (strcmp(text, "hello") == 0) {
// Do something
} else {
// Do something else
}
Вы сравниваете не контент, а адреса.
Для сравнения данных вы должны использовать функцию strcmp-ish.
Строки C не являются объектами и не могут сравниваться с ==
; использование strcmp()
,
В сравнении
text == "hello"
вы сравниваете адрес памяти, где хранится ваш текст, с адресом, в котором хранится константный строковый литерал "hello". Это потому, что строка C на самом деле является указателем на массив символов. Затем он интерпретируется как последовательность символов, пока не будет достигнут нулевой терминатор.
Включить библиотеку
include <string.h>;
и сделать сравнение как
!strcmp(text, "hello");
strcmp()
Функция принимает две строки и возвращает 0, если они равны, и ненулевое, если они не равны. Если оно ненулевое, то отрицательное / положительное значение определяет, какое из них лексикографически меньше (первое / второе), а абсолютное значение определяет первый символ, где они отличаются.
GLib (#include <glib.h>
, у вас должно быть это, так как у вас есть GTK) для этой цели есть функция g_ascii_strcmp(). Если ваш текст не является ascii (что весьма вероятно, поскольку это пользовательский ввод, который может содержать практически все), вы должны сравнить его с g_utf8_collate().