цикл do-while для проверки ввода пользователя с помощью c - PullRequest
1 голос
/ 13 ноября 2010

Я использую этот фрагмент кода, чтобы прочитать ввод пользователя и проверить, является ли это число или нет. Но искренне это просто работает для цифр и букв.Я хочу, чтобы он работал с каждым символом.Например "!?%".Я уже пытался изменить "isalnum" на "isascii", но это не работает.

#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 ]

2 голосов
/ 13 ноября 2010

Правильный способ в строго C89 с очисткой входного буфера, проверка переполнения выглядит так:

2 голосов
/ 13 ноября 2010

Если у вас нет особых требований, вы должны использовать fgets и 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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...