2017-09-06 27 views
1

文字列が絶対パスか相対パスかを調べるためにCで非常に簡単な関数を書いています。私が何を試しても、常にfalseを返す。cの文字列の最初の文字を確認する

int isAbsolute(char *str){ 
    if(strcmp(str,"/")){ 
     return 1; 
    } 
    return 0; 
} 

と私はそれが好きで呼び出します:ここで

は、私が試したものであるたびにfalseを返している

printf("%d\n", isAbsolute("/")); 

。私は明らかに何かを見逃していますが、私はそれを理解することができませんでした...

+4

に行くされていない理由、それは 'strcmp'は、文字列全体を比較していますので、あなたが渡している文字列は「/」である場合にのみtrueを返します。 'strncmp'を見るか、文字列の代わりに1つの文字(' if(str [0] == '/') ')だけを比較することができます。 – AntonH

+0

@AntonH:なぜこれを回答にしないのですか? – alk

+0

@alk私はそれがなぜ機能していないのかコメントするつもりだったが、後で解決策を編集した。答えとして今置け... – AntonH

答えて

5

コンパイラにアクセスできませんが、Cスタイルの文字列は終了キャラクター:比較されている文字列が同じ長さであれば

int isAbsolute(const char *str){ 
    return (str[0] == '/'); 
} 
+0

あなたの最初の例はうまく動作します –

+2

'const char * str'を使いたいかもしれません。 – alk

+0

ありがとうございます。高校の頃からCをやっていない。 –

3

指摘されたように、strcmpにのみ一致します。文字列の前にある単一の文字を比較するために、

あなただけ行うことができ、:

int isAbsolute(const char *str) { 
    return (str[0] == '/'); 
} 

あなたが探しているプレフィックスが長い1文字以上であれば、thisは役立つかもしれません。私はフレッド・フーの答えが(大多数の有権者のように)受け入れられたものよりも良いのが好きです。

2

strcmpは文字列全体を比較するので、渡す文字列が "/"の場合、関数はtrueを返します。

あなたが代わりにstrncmpはで見ることができます:

if(strncmp(str,"/", 1)) ... 

または唯一の文字比較:strncmpに同様

(if (str[0] == '/')) ... 
1

あなたが引数として比較するバイト数を持つmemcmpを使用することができました:

int isAbsolute(const char *str){ 
    if (0 == memcmp(str, "/", 1){ 
     return 1; 
    } else { 
     return 0; 
    } 
} 

return va lue $ 0 $は平等を意味します。あなたのコードでは、おそらく意図した通りではない場合には0を返します。

0

のstrcmpの戻り値は、成功の場合にはゼロである、それは本当の

関連する問題