理由はよくわかりませんが、うまくいかないようです。私には完全に有効なようです:
gchar *text = gtk_entry_get_text(entry);
if(text == "hello") {
//do sth
}
else {
//do sth else
}
helloと入力しても何も起こりませんが、else{}のコードが呼び出されます。何が問題ですか?
次を使用して文字列を比較する必要がありますstrcmp
。
if(strcmp(text, "hello") == 0) {
//do sth
}
else {
//do sth else
}
あなたがしていることは、2 つのポインタを比較することです。 続きを読む.
C では、文字列リテラルは多くの状況でポインターになる配列です。使用するときに比較するのは、文字列==
のアドレス(または、各文字列の最初の文字のアドレス) であり、期待するような文字列の内容ではありません。例えば:
if (text == "hello")
やっているようなものです:
if (0x800050a0 == 0x80001000)
text
が の文字を格納しているのと同じ場所を指している可能性は低いです"hello"
。
C で文字列を比較するにstrcmp
は、文字列の相互比較に基づいて整数を返す を使用する必要があります。文字列が等しい場合、関数は 0 を返します。最初の文字列が 2 番目の文字列よりも辞書的に小さい場合、関数は -1 を返します。それ以外の場合、関数は 1 を返します。
text
あなたのプログラムは、文字列とのポインタを比較します"hello"
。文字列を文字ごとに比較するわけではありません。
(他の回答者は、文字ごとの比較を達成する手段を示しています)
あなたのコードはポインタを比較しますが、それらは明らかに等しくありません。文字列を比較したいので、おそらく次のようなことをする必要があります。
if (strcmp(text, "hello") == 0) {
// Do something
} else {
// Do something else
}
コンテンツではなくアドレスを比較しています。
データを比較するには、strcmp っぽい関数を使用する必要があります。
C 文字列はオブジェクトではないため、 と比較できません==
。使用してstrcmp()
ください。
GLib(#include <glib.h>
、GTKがあるので、持っている必要があります)には、この目的のためにg_ascii_strcmp()関数があります。テキストがASCII以外の場合(ユーザー入力である可能性が非常に高く、事実上すべてを保持できます)、代わりにg_utf8_collate()と比較する必要があります。
比較では
text == "hello"
テキストが保存されているメモリアドレスと、定数文字列リテラル「hello」が保存されているアドレスを比較しています。これは、C 文字列が文字配列へのポインタであるためです。その後、null ターミネータに到達するまで、一連の文字として解釈されます。
ライブラリを含める
include <string.h>;
そして比較を行います
!strcmp(text, "hello");
このstrcmp()
関数は 2 つの文字列を取り、等しい場合は 0 を返し、そうでない場合は 0 以外を返します。ゼロ以外の場合、負/正の値はどちらが辞書編集的に小さいかを決定し(最初/2番目)、絶対値はそれらが異なる最初の文字を決定します。