我真的不知道为什么,但似乎并不奏效。似乎对我完全有效:检查字符是否
gchar *text = gtk_entry_get_text(entry);
if(text == "hello") {
//do sth
}
else {
//do sth else
}
即使当我输入hello时,什么也没有发生,只是调用else {}中的代码。问题是什么?
我真的不知道为什么,但似乎并不奏效。似乎对我完全有效:检查字符是否
gchar *text = gtk_entry_get_text(entry);
if(text == "hello") {
//do sth
}
else {
//do sth else
}
即使当我输入hello时,什么也没有发生,只是调用else {}中的代码。问题是什么?
在C中,字符串文字是在许多情况下变成指针的数组。当你使用==
时,你比较的是地址的字符串(或者说,每个字符串的第一个字符的地址),而不是像你期望的字符串的内容。例如:
if (text == "hello")
是有点像做:
if (0x800050a0 == 0x80001000)
这是不可能的text
指向被存储字符"hello"
相同的位置。
要比较C中的字符串,应该使用strcmp
,它根据字符串如何相互比较返回一个整数。如果字符串相等,该函数返回0;如果第一个字符串是字典顺序比第二字符串更小,则该函数返回-1,否则该函数返回1
尼斯回答,谢谢大伙。 – Rrjrjtlokrthjji 2012-04-15 20:00:48
您需要使用strcmp
来比较字符串:
if(strcmp(text, "hello") == 0) {
//do sth
}
else {
//do sth else
}
你在做什么是比较两个指针。 Read more。
你是正确的,我的错误:) – Rrjrjtlokrthjji 2012-04-15 19:57:27
C字符串不是对象,不能与==
进行比较;使用strcmp()
。
你的程序比较字符串text
和"hello"
的指针。它不会逐字符比较字符串。
(其他回答者演示手段来完成由字符比较字符)
您的代码进行比较指针和他们显然不相等。您想比较字符串,因此您可能需要执行类似操作:
if (strcmp(text, "hello") == 0) {
// Do something
} else {
// Do something else
}
您并未比较内容,但地址。
要比较数据,您应该使用strcmp-ish函数。
在比较
text == "hello"
您将存储文本的内存地址与存储常量字符串“hello”的地址进行比较。这是因为C字符串实际上是指向字符数组的指针。然后将它解释为一个字符序列,直到达到空终止符。
包括图书馆
include <string.h>;
,并做比较,因为
!strcmp(text, "hello");
的strcmp()
函数有两个字符串,返回0,如果他们是平等的,非零,如果他们不。如果不为零,则负/正值确定哪一个是字典序的情况下(第一/第二)和绝对值确定它们的不同的第一个字符。
是的,我现在明白了。谢谢你的回答 – Rrjrjtlokrthjji 2012-04-15 19:59:51
GLib(#include <glib.h>
,你应该拥有它,因为你有GTK)有一个g_ascii_strcmp()函数用于此目的。如果你的文本不是ascii(这很可能是因为它是用户输入,几乎可以容纳任何东西),你应该用g_utf8_collate()来代替。
正如您使用'Gtk'因此'Glib',可以利用['g_Strcmp0'](http://developer.gnome.org/glib/2.28/glib-String-Utility-Functions.html #G-strcmp0),其中处理比STRCMP – 2012-04-16 16:52:03
NULL更好interesting.i'll记住这一点。 – Rrjrjtlokrthjji 2012-04-16 18:45:31