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...
In this situation i would go for a
sscanf()
.As you have already used in your code, the prototype for
main
function isint main (int argc, char** argv)
What ever arguments are provided as command line arguments, they are passed to your 'program' as an array of char * (or simply strings). so if you invoke a prog as
foo.exe 123
, the first argument tofoo.exe
will be a string 123 and not an integer value of 123.If you try casting the argument to integer (as you said) probably using some thing like:
(int) argv[1]
, you will not get the integer value of first argument, but some memory address where the first arg is stored in your address space. To get an integer value, you must explicitly convert string value to integer value. For this, you can useatoi
function. Check THIS man page for similar functions that can be used for conversion.You need to use
atoi()
to convert from string to integer.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 usesscanf
.Use
strtol
, or its relativestrtoul
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 typesatoi
andsscanf
will cheerfully return 123, which is almost certainly not what you want. Onlystrtol
will tell you (via theendptr
) that it processed only the first few characters of the string.(There is no
strtoi
, but there isstrtod
if you need to read a floating-point number.)No, you can't just cast to convert it to an integer value. You need to transform it using sscanf, atoi, atol or similar function.
Use
atoi
.And declare cvalue as an
int
.