2012-01-20 9 views
1

Cで "strcmpの引数2を渡すと、キャストのない整数からポインタを作る"というエラーはどういう意味ですか?私は私のCコードをコンパイルしていますし、2つのエラーを取得しています

警告:ノート:strcmpの引数2を渡すと、キャスト

警告なし整数からポインタになります:期待されるconst char *しかし、引数はint型です

私のメイン:

int main(int argc, char *argv[]) 
{ 
    //check to make sure that the command line arguments are valid 
    if(argc!=3) 
    { 
     printf("invalid function call try again\n"); 
    } 

    //else to choose the proper command 
    else 
    { 
     //reverse routine A   
     if(strcmp(argv[2],'a'||'A')==0) //line 138 
     { 
      reva(argv[1]); 
     } 
     //reverse routine B 
     else if(strcmp(argv[2],'b'||'B')==0) //line 143 
     { 
      revb(argv[1]); 
     } 
     //reverse routine C 
     else if(strcmp(argv[2],'c'||'C')==0) //line 148 
     { 
      revc(argv[1]); 
     } 
     //unacceptable command line argumant 
     else 
     { 
      printf("unacceptable command line argument for reverse routine try again:\n"); 
     } 
    } 

} 
+0

コードを問題の行に編集した場合に役立ちます。 –

+0

@user ''a'!=" a "; – Mahesh

+0

あなたのコードは、文字列と文字列を比較します。 –

答えて

6

これは、その意味です。 'a'||'A'は、整数–であり、具体的には、整数1です。 strcmpの2番目の引数は、整数ではなく文字列でなければなりません。

argv[2]aAを比較するように見えます。それには2つの異なるstrcmpが必要です。また、単一引用符ではなく、二重引用符を使用する必要があります。

+0

本当に、私は少し複雑な可能性を考えていました。編集。 – ibid

+0

ようこそ! +1 FOR "また、あなたは単一の引用符ではなく二重引用符を使用する必要があります" – iLearner

3

"C"では、 '||' operatorはブール値の 'または'演算であり、連結演算ではありません。また、アポストロフィの使用は、基本的に「char」型の単一の文字を示します。

私はこのようなものが欲しいと思います(行148): if(strcmp(argv [2]、 "C")== 0 ||(strcmp(argv [2]、 "c")== 0)...

や、あなたのCライブラリは、それをサポートしている場合: 私はと信じて大文字小文字を区別しない比較です

1

です(strcasecmp(ARGV [2]、 "C")== 0) 場合あなたのオブジェクトは、コマンドライン引数(argv [2])を文字(文字列) "C"または "c"と比較することです。つまり、ユーザがコマンドラインでcまたはCを指定した場合です。

SOユーザーには説明があります。あなたに

(のstrcmp(ARGV [2]、 "C")== 0 ||(のstrcmp(ARGV [2]、 "C")== 0)

を使用する必要が

しかし、これはCのコマンドライン引数を解析する最適な方法ではありません。ユーザー入力を解析する際にプログラムが複雑すぎる場合は、ライブラリ "getopt"を使用することをお勧めします。ユーザーが構造化された方法で入力を解析して分析するのに役立ちます。

ここに小さなコードスニップがありますer

opt = getopt_long(argc, argv, optString, longOpts, &longIndex); 
    while(opt != -1) { 
     switch(opt) { 
      case 'I': 
       globalArgs.noIndex = 1; /* true */ 
       break; 

      case 'l': 
       globalArgs.langCode = optarg; 
       break; 

      case 'o': 
       globalArgs.outFileName = optarg; 
       break; 

      case 'v': 
       globalArgs.verbosity++; 
       break; 

      case 'h': /* fall-through is intentional */ 
      case '?': 
       display_usage(); 
       break; 

      case 0:  /* long option without a short arg */ 
       if(strcmp("randomize", longOpts[longIndex].name) == 0) { 
        globalArgs.randomized = 1; 
       } 
       break; 

      default: 
       /* You won't actually get here. */ 
       break; 
     } 

     opt = getopt_long(argc, argv, optString, longOpts, amp;longIndex); 
    } 

getoptとgetopt_longのドキュメント(またはLinuxのマニュアルページ)を検索してください。ここにはGNUの例があります。

関連する問題