Here's one way, using strtol and checking the end of the string:
#include <stdio.h> #include <stdlib.h> int main(int argc,char **argv) { char *cp; long lval; int val; // skip over program name --argc; ++argv; if (argc < 1) { fprintf(stderr,"main: no argument specified\n"); exit(1); } cp = *argv; if (*cp == 0) { fprintf(stderr,"main: argument an empty string\n"); exit(1); } lval = strtol(cp,&cp,10); if (*cp != 0) { fprintf(stderr,"main: argument '%s' is not an integer -- '%s'\n", *argv,cp); exit(1); } val = (int) lval; // NOTE: just going for extra credit here ;-) // ensure number fits in a int (since strtol returns long and that's 64 // bits on a 64 bit machine) #if 1 if (val != lval) { fprintf(stderr,"main: argument '%s' (with value %ld) is too large to fit into an integer -- truncated to %d\n", *argv,lval,val); exit(1); } #endif printf("val=%d\n",val); return 0; }
UPDATE:
Minor: Code does not detect conversion overflow of strtol() Code incorrectly assumes range of long more than int. If same range, if (val != lval) is always true. Suggest looking at errno, INT_MAX,INT_MIN
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <limits.h> int main(int argc,char **argv) { char *cp; long lval; int val; // skip over program name --argc; ++argv; if (argc < 1) { fprintf(stderr,"main: no argument specified\n"); exit(1); } cp = *argv; if (*cp == 0) { fprintf(stderr,"main: argument an empty string\n"); exit(1); } errno = 0; lval = strtol(cp,&cp,10); if (*cp != 0) { fprintf(stderr,"main: argument '%s' is not an integer -- '%s'\n", *argv,cp); exit(1); } // on a 32 bit machine, entering 2147483648 will produce a non-zero errno if (errno) { fprintf(stderr,"main: argument '%s' parse error -- '%s'\n", *argv,strerror(errno)); exit(1); } // on a 64 bit machine, entering 2147483648 will not produce an error, so // we should check the range ourselves if ((lval < INT_MIN) || (lval > INT_MAX)) { fprintf(stderr,"main: argument '%s' range error -- %ld outside of range (%ld to %ld)\n", *argv,lval,(long) INT_MIN,(long) INT_MAX); exit(1); } val = (int) lval; // NOTE: just going for extra credit here ;-) // ensure number fits in a int (since strtol returns long and that's 64 // bits on a 64 bit machine) // FIXME -- with above tests this can never be true (i.e. fault), so // I've nop'ed it -- left in to show prior/original test #if 0 if (val != lval) { fprintf(stderr,"main: argument '%s' (with value %ld) is too large to fit into an integer -- truncated to %d\n", *argv,lval,val); exit(1); } #endif printf("val=%d\n",val); return 0; }
char* argv[]is an array of pointers to string. None of them is anint, although it could be numeric. You have to convert it yourself.strtol(argv[]...)did conversion occur?, trailing non-numeric text? in range ofint? 3) Pedantic details include if leading/trailing white-space allowed?