Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to take integers as command line arguments?

Tags:

I've read a getopt() example but it doesn't show how to accept integers as argument options, like cvalue would be in the code from the example:

 #include <ctype.h>  #include <stdio.h>  #include <stdlib.h>  #include <unistd.h>   int  main (int argc, char **argv)  {    int aflag = 0;    int bflag = 0;    char *cvalue = NULL;    int index;    int c;     opterr = 0;     while ((c = getopt (argc, argv, "abc:")) != -1)      switch (c)        {        case 'a':          aflag = 1;          break;        case 'b':          bflag = 1;          break;        case 'c':          cvalue = optarg;          break;        case '?':          if (optopt == 'c')            fprintf (stderr, "Option -%c requires an argument.\n", optopt);          else if (isprint (optopt))            fprintf (stderr, "Unknown option `-%c'.\n", optopt);          else            fprintf (stderr,                     "Unknown option character `\\x%x'.\n",                     optopt);          return 1;        default:          abort ();        }     printf ("aflag = %d, bflag = %d, cvalue = %s\n",            aflag, bflag, cvalue);     for (index = optind; index < argc; index++)      printf ("Non-option argument %s\n", argv[index]);    return 0;  } 

If I ran the above as testop -c foo, cvalue would be foo, but what if I wanted testop -c 42? Since cvalue is of type char *, could I just cast optarg to be (int)? I've tried doing this without using getopt() and accessing argv[whatever] directly, and casting it as an integer, but I always end up with a large negative number when printing with %d. I'm assuming I'm not dereferencing argv[] correctly or something, not sure...

like image 842
Andrew Avatar asked Jan 25 '11 17:01

Andrew


2 Answers

You need to use atoi() to convert from string to integer.

like image 113
Vlad H Avatar answered Oct 06 '22 00:10

Vlad H


All of the answers above are broadly correct (Vikram.exe gets props for explaining why you have to call a library function, which nobody else bothered to do). However, nobody has named the correct library function to call. Do not use atoi. Do not use sscanf.

Use strtol, or its relative strtoul if you don't want to allow negative numbers. Only these functions give you enough information when the input was not a number. For instance, if the user types

./a.out 123cheesesandwich 

atoi and sscanf will cheerfully return 123, which is almost certainly not what you want. Only strtol will tell you (via the endptr) that it processed only the first few characters of the string.

(There is no strtoi, but there is strtod if you need to read a floating-point number.)

like image 34
zwol Avatar answered Oct 05 '22 22:10

zwol