2011-07-06 13 views
1

は私が関数から返されたchar型のポインタを持っている、と私はのcharポインタとIF文

substring関数here

からC.で、このいずれかを実装する必要がありますどのようにIF文を使用してその値を再確認したいです

文は常に一部「という操作を行う」に行けば、私はそれをこの

if (substring("xxxNameYYY",0,3)=="xxx"){ 
    //do this 
} else { 
    //do that 
} 

上記のような何かをしたいです。あなたがCにそのような文字列を比較することはできません

おかげ

+0

みなさん、ありがとうございました。 – Aries

答えて

8

は、あなたは彼らが等しいかどうかを確認するためにstrcmp(str1, str2) == 0を使用する必要があります。あなたのケースでは

char * substr = substring("xxxNameYYY",0,3); 
if (strcmp(substr, "xxx") == 0) { 
    /* TODO */ 
} 
else { 
    /* TODO */ 
} 
1

利用代わりstrncmp機能:

if (strncmp("xxxNameYYY", "xxx", 3)==0){ 
    //do this 
} else { 
    //do that 
} 

Iあなたのコード、あなたのsubstring機能ためだ2つのポインタではなく、彼らは

2

を指す文字列を比較しますCの文字列(charの値を指すポインタ)を返し、別のCの文字列と比較しますポインタアドレスを2つ比較します。これら2つのポインタは決して同じではないので、elseブランチに入ります。

これは、最初にsubstring機能を使用しないようにするための最善の方法です。関数は内部的にメモリを割り当てます。メモリを解放するのはあなたの責任です(freeを使用)。これはかなり誤りがちです。

代わりにstrncmp関数を使用して比較を行うことができます。私はこのように、startsWith機能でそれをラップします:これは==は、ポインタの値を比較していること、ポインタであるので

/* Yields true if s starts with t */ 
bool startsWith(const char *s, const char *t) 
{ 
    return strncmp(s, t, strlen(t)) == 0; 
} 

あなたはその後、

if (startsWith("xxxNameYYY", "xxx")) { 
    //do this 
} else { 
    //do that 
} 
4

にあなたのコードを簡素化することができ、その指す文字列ではありません。したがって、返されたポインタは、 "xxx"を指すポインタと等しくなることはありません。文字列内の文字をstrcmpまたはその変形で比較する必要があります。これは動作するはず

3
if (!strncmp("xxxNameYYY", "xxx", 3)) 

そのサイズがコンパイル時に知られているので、Cの文字列定数はデータセクションに割り当てられているので、それが失敗していることが理由です。あなたが比較を終えるのは、substring("xxxNameYYY", 0, 3)のアドレスと決して等しくならない "xxx"のアドレスです。

関連する問題