user1013414
user1013414

Reputation: 9

What does "passing argument 2 of strcmp makes pointer from integer without a cast" error in C mean?

I am compiling my C code and am getting two errors:

warning:passing argument 2 of strcmp makes pointer from integer without a cast

and

warning: note: expected const char * but argument is of type int

This my main:

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

}

Upvotes: 1

Views: 25127

Answers (3)

schtever
schtever

Reputation: 3250

In "C", the '||' operator is a boolean 'or' operation, not a concatenation operation. Also, the use of apostrophes denotes a single character which basically 'char' type.

I think you want something like this (for line 148):

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

or, if your C library supports it:

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

which is a case insensitive comparison.

Upvotes: 3

cateof
cateof

Reputation: 6758

I believe that your object here is to compare the command line argument (argv[2]) with the character (string) "C" or "c", ie you just if the user gave c or C at the command line.

The SO users have already offered an explanation. You need to use

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

in order to eliminate your warning.

However, this is not the optimal way to parse command line arguments in C. If your program is too complicated when parsing user input I would suggest to use the library "getopt". It is designed to help the user parse and analyze the input in a structured manner.

Here is a small code snipper

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

Please search some documents (or the linux man pages) for getopt and getopt_long. Here is an example from GNU.

Upvotes: 1

ibid
ibid

Reputation: 3902

It means what it says. 'a'||'A' is an integer – specifically, it is the integer 1. The second argument of strcmp must be a string, not an integer.

You appear to intend to compare argv[2] to a and A. You need two different strcmp calls for that. Also, you need to use double, not single, quotes.

Upvotes: 6

Related Questions