开发者

do-while loop for checking users input using c

I'm using this piece of code to read users input and check if it is a number or not.But sincerly it just works for numbers and letters. I want it to work with every char. For example "!?%". I have already tried to change the "isalnum" by "isascii" but that does not work.

#include <stdio.h>
#include <ctype.h>

int main ()
  {

    int a开发者_开发百科;
    int b = 1;
    char c ;

     do
     { 
       printf("Please type in a number: ");

       if (scanf("%d", &a) == 0)
       {
         printf("Your input is not correct\n");
         do 
         {
           c = getchar();
         }
         while (isalnum(c));  
         ungetc(c, stdin);    
       }
       else
       { 
         printf("Thank you! ");
         b--;
       }

     }
     while(b != 0); 

     getchar();
     getchar();

     return 0;
  }


Unless you have specific requirements, you should use fgets and sscanf

while (1) {
    char buf[1000];
    printf("Please input a number: ");
    fflush(stdout);
    if (!fgets(buf, sizeof buf, stdin)) assert(0 && "error in fgets. shouldn't have hapenned ..."):
    /* if enter pending, remove all pending input characters */
    if (buf[strlen(buf) - 1] != '\n') {
        char tmpbuf[1000];
        do {
            if (!fgets(tmpbuf, sizeof tmpbuf, stdin)) assert(0 && "error in fgets. shouldn't have hapenned ...");
        } while (buf[strlen(tmpbuf) - 1] != '\n');
    }
    if (sscanf(buf, "%d", &a) == 1) break; /* for sufficiently limited definition of  "numbers" */
    printf("That was not a number. Try again\n");
}


A correct way in strictly C89 with clearing input buffer, checking overflow looks like:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int readLong(long *l)
{
  char *e,in[20];
  fgets( in,20,stdin );
  if(!strchr(in,'\n')) while( getchar()!='\n' );
  else *strchr(in,'\n')=0;
  errno=0;
  *l=strtol(in,&e,10);
  return *in&&!*e&&!errno;
}

int main()
{
  long l;
  if( readLong(&l) )
    printf("long-input was OK, long = %ld",l);
  else
    puts("error on long-input");
  return 0;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜