Проверка 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().

Другие вопросы по тегам