do-while循环用于使用c检查用户输入

时间:2010-11-13 11:55:26

标签: c visual-c++

我正在使用这段代码来读取用户输入并检查它是否是一个数字。但是,它真的只适用于数字和字母。我希望它可以与每个字符一起使用。例如 ”!?%”。我已经尝试通过“isascii”更改“isalnum”但这不起作用。

#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;
  }

2 个答案:

答案 0 :(得分:2)

除非您有特定要求,否则应使用fgetssscanf

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");
}

答案 1 :(得分:2)

严格C89的正确方法是清除输入缓冲区,检查溢出如下:

#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;
}