linux-c-programming.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Rechberger Markus <mrechberger@gmail.com>
To: linux-c-programming@vger.kernel.org
Subject: Re: getopt() library function options
Date: Sat, 5 Mar 2005 10:57:54 +0100	[thread overview]
Message-ID: <d9def9db05030501573360eeab@mail.gmail.com> (raw)
In-Reply-To: <Pine.LNX.4.21.0503042213210.2483-100000@hestia>

Hey,

regarding atoi:

#include <stdio.h>

int main(){
        printf("value: %d\n",atoi("nosegv123"));
        return(0);
}
output:
value: 0

this doesn't segfault


SYNOPSIS
       #include <ctype.h>

       int isalnum(int c);
       int isalpha(int c);
       int isascii(int c);
       int isblank(int c);
       int iscntrl(int c);
       int isdigit(int c);
       int isgraph(int c);
       int islower(int c);
       int isprint(int c);
       int ispunct(int c);
       int isspace(int c);
       int isupper(int c);
       int isxdigit(int c);

ctype only takes one variable as argument _not_ a string, he would
have to check every element of the array with isdigit.

Markus
On Fri, 4 Mar 2005 22:16:54 +0100 (CET), J. <mailing-lists@xs4all.nl> wrote:
> On Thu, 3 Mar 2005, Fabio wrote:
> 
> > Hello,
> >
> > I am coding a small utility for system administrator.
> > The following command line options will be accepted:
> 
> ........
> 
> > This was I got on a getopt() man page, I understand some basic concept,
> > but I cant put the unaccpted arguments to work. Thanks alot if someone
> > can build this from scratch.
> >
> > Thanks in advance,
> >
> > fabio.
> 
> Friday, March 03
> 
> You could use an regex to determine if your dealing with an INT or
> not.. Or check the option string with isdigit() <ctype.h>.
> 
> If atoi is used on non-digit conversion the result is a segfault.
> Use strtol family instead because atoi can't detect errors. Also
> casting return value's is a bad idea since they can hide errors..
> 
> your code with might looklike something like this....
> 
> #include <stdio.h>
> #include <getopt.h>
> #include <stdlib.h>
> 
> #include <regex.h>
> #include <locale.h>
> 
> #define PACKAGE    "getoptex"
> #define VERSION    "0.0.1"
> 
> void print_help(int exval);
> int isthisanint(char *str);
> 
> int main(int argc, char *argv[]) {
>  int opt;
> 
>  /*
>  // no arguments given
>  */
>  if(argc == 1) {
>   fprintf(stderr, "This program needs arguments....\n\n");
>   print_help(1);
>  }
> 
>  while((opt = getopt(argc, argv, "hVvd:f:o:")) != -1) {
>   switch(opt) {
>    case 'h':
>     print_help(0);
>    case 'V':
>     printf("%s %s\n\n", PACKAGE, VERSION);
>     exit(0);
>    case 'v':
>     printf("%s: Verbose option is set `%c'\n", PACKAGE, optopt);
>     break;
>    case 'd':
>     printf("%s: isthisanint(%s), says: %d\n", PACKAGE,
>       optarg, isthisanint(optarg));
>     break;
>    case 'f':
>     printf("%s: Filename %s\n", PACKAGE, optarg);
>     break;
>    case 'o':
>     printf("Output: %s\n", optarg);
>     break;
>    case ':':
>     fprintf(stderr, "%s: Error - Option `%c' needs a value\n\n", PACKAGE, optopt);
>     exit(1);
>    case '?':
>     fprintf(stderr, "%s: Error - No such option: `%c'\n\n", PACKAGE, optopt);
>     exit(1);
>    }
>  }
> 
>  /*
>  // print all remaining options
>  */
>  for(; optind < argc; optind++)
>   printf("argument: %s\n", argv[optind]);
> 
>  return 0;
> }
> 
> void print_help(int exval) {
>  printf("%s,%s show working getopt example\n", PACKAGE, VERSION);
>  printf("%s [-h] [-V] [-v] [-d INT] [-f FILE] [-o FILE]\n\n", PACKAGE);
> 
>  printf("  -h              print this help and exit\n");
>  printf("  -V              print version and exit\n\n");
> 
>  printf("  -v              set verbose flag\n");
>  printf("  -d INT          set `-d' to `INT'\n");
>  printf("  -f FILE         set intput file\n");
>  printf("  -o FILE         set output file\n\n");
> 
>  exit(exval);
> }
> 
> int isthisanint(char *str) {
>  regex_t re;
>  int retval = -1;
> 
>  setlocale(LC_ALL, "");
>  if(regcomp(&re, "^([0-9]*)$", REG_EXTENDED) != 0) {
>   fprintf(stderr, "%s: Error - Unable to compile regex", PACKAGE);
>   return -1;
>  }
> 
>  if(regexec(&re, str, 0, NULL, 0) != 0)
>   retval = -1;
>  else
>   retval = atoi(str);
> 
>  /* or.. Like listed in the manual page */
>  /*  strtol(nptr, (char **)NULL, 10); */
> 
>  regfree(&re);
>  return retval;
> }
> 
> Hope that left you with some usable idea's...
> 
> GoodLuck..
> 
> J.
> 
> --
> http://www.rdrs.net/
> 
> 
> -
> To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>

  reply	other threads:[~2005-03-05  9:57 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-03-04 21:16 getopt() library function options J.
2005-03-05  9:57 ` Rechberger Markus [this message]
2005-03-05 12:18   ` J.
2005-03-05 13:37     ` Rechberger Markus
  -- strict thread matches above, loose matches on Subject: below --
2005-03-04 15:42 Huber, George K RDECOM CERDEC STCD SRI
2005-03-04  4:35 Fabio
2005-03-04  8:42 ` Steve Graegert
2005-03-04  8:49 ` Rechberger Markus
2005-03-04 20:37 ` J.

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d9def9db05030501573360eeab@mail.gmail.com \
    --to=mrechberger@gmail.com \
    --cc=linux-c-programming@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).