проверка ввода с использованием цикла do-while с c, c ++ - PullRequest
2 голосов
/ 10 ноября 2010

Здравствуйте, я пытаюсь использовать цикл do-while для проверки ввода и повторения запроса, пока пользователь не введет правильное целое число. Так вот мой код:

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

int main ()
{

  int a;

  do
  {
     printf("Please type in your number: ");
  }while(scanf_s("%d", &a) == 0); 

  std::cin.get();
  std::cin.get();

  return 0;
}

Ну, похоже, работает. Когда я набираю число, программа работает правильно. Но когда я набираю букву, начинается бесконечный цикл. С уважением, я не знаю, где проблема.

Ответы [ 7 ]

4 голосов
/ 10 ноября 2010

Опять же, я предлагаю прочитать строку в строку и затем попытаться разобрать эту строку в соответствии с вашими потребностями. Если синтаксический анализ не удался, просто попросите пользователя снова. Вы можете похоронить грязные детали в шаблоне функции:

#include <iostream>
#include <sstream>
#include <string>

template <typename T>
T read(std::string prompt)
{
    for (; ;)
    {
        std::cout << prompt;
        std::string line;
        getline(std::cin, line);
        std::istringstream ss(line);
        T x;
        if ((ss >> x) && (ss >> std::ws).eof()) return x;
    }
}

int main ()
{
    int a = read<int>("Please type in your number: ");
    std::cout << "You entered " << a << '\n';
}
3 голосов
/ 10 ноября 2010

Вот что происходит - я пройдусь шаг за шагом. Начиная с do:

  1. вывод: Пожалуйста, введите ваш номер:
  2. вызов scanf Scanf обнаруживает, что stdin пуст, и поэтому ожидает ввода строки.
  3. input: letter (обратите внимание, что входной буфер теперь содержит «букву»)
  4. scanf пытается проанализировать строку как целое число. Сбой разбора до того, как он потребляет какие-либо символы. Поэтому буфер все еще содержит "букву"
  5. scanf возвращает EOF (ошибка)
  6. вывод: Пожалуйста, введите ваш номер:
  7. вызов scanf - scanf видит, что в stdin
  8. scanf пытается проанализировать буфер как целое число .....

Это будет продолжаться вечно, потому что scanf никогда не будет потреблять символы из буфера. Вы можете решить эту проблему, правильно проверив код возврата ошибки из scanf.

0 голосов
/ 19 октября 2012

@ ordo

Цитата

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

Blockquote

Вы можете использовать

if (userInput> = '!' && userInput <= '~') // ссылается на диаграмму ASCII между! И ~. {выход = 0; } </p>

http://www.cdrummond.qc.ca/cegep/informat/professeurs/alain/images/ASCII1.GIF

0 голосов
/ 06 сентября 2012
int main ()
{    
  int a;
  char userInput,exit=1;

  do
  {
     printf("Please type in your number: ");
     userInput=getch();

     if(userInput=='1') // suppose the correct input is 1.
     { exit=0; }         

  }while(exit); 

  std::cin.get();
  std::cin.get();

  return 0;
}

Если входное значение находится между 0 и 9 ...

 if(userInput>='0'&& userInput<= '9') // suppose the correct input is 1.
    { exit=0; }

Обратите внимание, что мы должны использовать знаки ''

0 голосов
/ 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;
  }
0 голосов
/ 10 ноября 2010

Вы можете использовать getchar() функцию

do
  {
     printf("Please type in your number: ");
  }while((getchar() - '0') == 0); 
0 голосов
/ 10 ноября 2010

Прежде всего, никогда не используйте scanf как чертовски опасную функцию.

Если вы хотите придерживаться C, вы должны использовать fgets для чтения ввода от пользователя в буфер, а затем atoi для преобразования ввода от пользователя в целое число.

Примечание: fgets всегда добавляет 'enter' в буфер, поэтому вы хотите удалить его перед преобразованием содержимого буфера.

это можно легко сделать следующим образом:

_buffer[strlen(_buffer)-1] = '\0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...