1

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");
        }
    }

}
4

3 に答える 3

6

それはそれが言うことを意味します。 'a'||'A'は整数です–具体的には、整数1です。の2番目の引数はstrcmp、整数ではなく文字列である必要があります。

とと比較argv[2]するつもりのようです。そのためには2つの異なる呼び出しが必要です。また、一重引用符ではなく、二重引用符を使用する必要があります。aAstrcmp

于 2012-01-20T06:07:39.030 に答える
3

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

私はあなたがこのようなものが欲しいと思います(148行目):

if (strcmp(argv[2], "C")==0 || (strcmp(argv[2], "c")==0) ...

または、Cライブラリがそれをサポートしている場合:

if (strcasecmp(argv[2], "C") == 0)

これは大文字と小文字を区別しない比較です。

于 2012-01-20T06:11:19.410 に答える
1

ここでの目的は、コマンド ライン引数 (argv[2]) を文字 (文字列) "C" または "c" と比較することだと思います。つまり、ユーザーがコマンド ラインで c または C を指定した場合です。

SOユーザーはすでに説明を提供しています。使用する必要があります

(strcmp(argv[2], "C")==0 || (strcmp(argv[2], "c")==0)

あなたの警告を消すために。

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

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

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の例を次に示します。

于 2012-01-20T20:30:50.187 に答える