2010-11-21 19 views
4

私はこのコードを持っている:argvを比較できませんか?

if (argv[i] == "-n") 
{ 
    wait = atoi(argv[i + 1]); 
} 
else 
{ 
    printf("bad argument '%s'\n",argv[i]); 
    exit(0); 
} 

このコードが実行されます場合は、私は次のエラーを取得:

bad argument '-n'

を、それはそれを行う理由を私は真剣に知りません。誰か説明できますか?

答えて

14

文字列の比較には、Cの関数が必要です。通常、strcmp()から<string.h>までです。

if (strcmp(argv[i], "-n") == 0) 
{ 
    wait = atoi(argv[i + 1]); 
} 
else 
{ 
    printf("bad argument '%s'\n",argv[i]); 
    exit(0); 
} 

strcmp()関数は(必ずしも-1)負の値を返す場合は第二の前に最初の引数ソート。最初の引数が2番目の引数の後にソートする場合は正の値(必ずしも+1ではない)。 2つの値が等しい場合はゼロを返します。

1

==演算子は、このアプリケーションでは文字列が効果的に文字ポインタであり、ポインタが比較されるため、文字列の内容には作用しません。

文字列の内容を比較するには、strcmpまたはstrncmpを使用します。

0

ポインタを比較しています(argv[i]"-n"char*const char*です)。

代わりにstrcmp()を使用してください。

0

あなたが実際にやっていることは、ポインタの比較です。 argv [i]は文字列ではなく、メモリ内の実際の文字列が始まる場所へのポインタです。 strcmp()を使用します。

0

文字列の内容ではなくポインタを比較しています。 argv[i]"-n"は、文字列内の文字が等しい場合でも、メモリ内の2つの異なる場所に格納された2つの異なる文字列です。

0

Cでは、演算子==は等しいかどうかを比較します。

同じ数値型の値が単純な方法で比較されます(つまり、2 + 2 == 4がtrue)。

異なる整数型(および非整数型)の値は、ある程度変換されます。他の場所を参照してください。

ポインタは同じアドレスのポイントであれば等しい。

文字列リテラルは、他のものと重複しないようにメモリ内に配置されます。 argv [i](i = 0〜argc)が指すものと重複しないことも含めて

したがって、2つの不等なポインタを比較しています。それが理由です。 if (!strcmp(argv[i], "-n")) { ... }を使用します。

0
int equal(char* stringa, char* stringb) { 
    while((*stringa) && (*stringb)) { 
     if(*stringa!=*stringb) 
      return FALSE; 
     stringa++; 
     stringb++; 
    } 
    return TRUE; 
} 

も私

のために働いています
関連する問題