2012-04-15 16 views
0

私には完全に有効なようだ:もし私が本当に理由を知らないが、それはうまくいかないと思われる場合は、

gchar *text = gtk_entry_get_text(entry); 
if(text == "hello") { 
    //do sth 
} 
else { 
    //do sth else 
} 

私はハロー入力した場合でも、何も起こりませんが、コード他では{}が呼び出されます。何が問題ですか?あなたはstrcmpを使用して文字列を比較する必要が

+0

あなたが 'Gtk'を使い、' Glib'を使っているので、['g_Strcmp0'](http://developer.gnome.org/glib/2.28/glib-String-Utility-Functions.html)を使うことができます#g-strcmp0)strcmpよりもNULLを扱いやすくなります –

+0

interesting.iはそのことを念頭に置いておきます。 – Rrjrjtlokrthjji

答えて

4

Cでは、文字列リテラルは多くの状況でポインタになる配列です。あなたが==を使用するときに比較していることはあなたのような文字列の内容は期待しているではない、アドレスの文字列(またはむしろ、各文字列の最初の文字のアドレス)のです。たとえば:

if (text == "hello") 

は、ソートの実行のようなものです:

if (0x800050a0 == 0x80001000) 

をそれは"hello"のために文字を格納されているのと同じ場所にtextポイントとは考えにくいです。 Cの文字列を比較するために、

、あなたは文字列がお互いに比較する方法に基づいて整数を返す、strcmpを使用する必要があります。文字列が等しい場合、この関数は0を返す最初の文字列が2番目の文字列より辞書小さい場合、この関数は-1を返し、そうでなければ関数は、比較

text == "hello" 

において

+0

ニースの答え、ありがとう、皆さん。 – Rrjrjtlokrthjji

4

if(strcmp(text, "hello") == 0) { 
    //do sth 
} 
else { 
    //do sth else 
} 

何をやっているでは二つのポインタを比較しています。 Read more

+0

あなたの正しい、私の間違い:) – Rrjrjtlokrthjji

1

Cの文字列はオブジェクトではなく、==と比較することはできません。 strcmp()を使用してください。

2

プログラムは、文字列text"hello"のポインタを比較します。文字列ごとに文字列を比較しません。

(他の回答者は、文字比較で文字を達成するための手段を発揮)

2

あなたのコードは、ポインタを比較し、それらが明らかに等しくありません。あなたは、おそらくのような何かをする必要があるので、文字列を比較したい:

if (strcmp(text, "hello") == 0) { 
    // Do something 
} else { 
    // Do something else 
} 
1

あなたは、コンテンツが、アドレス比較されていません。

データを比較するには、strcmp-ish関数を使用する必要があります。

0

を返しますあなたのテキストは定数文字列リテラル「こんにちは」が格納されているアドレスに格納されているメモリアドレスを比較しています。これは、C文字列が実際にはポインタの文字配列に対応するためです。その後、ヌル終端に達するまで、一連の文字として解釈されます。

は、ライブラリ

include <string.h>; 

を含めるとそうでない場合、彼らは等しく、ゼロでない場合strcmp()関数は、2つの文字列を取り、0を返す

!strcmp(text, "hello"); 

として比較を行います。ゼロ以外の値の場合は、負/正の値によって辞書編集的に小さいもの(1番目/ 2番目)が決定され、絶対値によって最初の文字が異なります。

+0

ええ、私は今それを得る。答えがありがとう – Rrjrjtlokrthjji

0

GLib(#include <glib.h>、あなたはGTKを持っているはずです)は、この目的のためにg_ascii_strcmp()関数を持っています。あなたのテキストがASCII以外のもの(事実上何かを保持できるユーザ入力である可能性が高い)の場合は、代わりにg_utf8_collate()と比較する必要があります。

関連する問題