проверьте правильность ввода пользователя - PullRequest
0 голосов
/ 06 января 2011

как мы можем проверить, что пользователь i / p введен правильно с помощью кода ac .. если, например, мы запрашиваем имя и возраст у пользователя i / p, то какой должен быть синтаксис для проверки правильности введенных данных илине?код должен быть в C

Ответы [ 4 ]

1 голос
/ 06 января 2011

Возраст, как правило, представляет собой натуральное число в диапазоне от 0 до 130. В зависимости от вашего приложения, более реалистичный диапазон может составлять от 15 до 65. Обратите внимание на ваши требования.

int IsNaturalNumber(const char* number)
{
    while(*number) {
        if(!isdigit(*number))
            return 0;
        ++number;
    }

    return 1;
}

char age[20+1] = { 0 };
if(!fgets(age, 20, stdin)) error("EOF reached!");
if(!IsNaturalNumber(age)) error("Please enter a natural number!");
int age_as_int = atoi(age);
if(age_as_int < LOWER_AGE_BOUND || age_as_int > UPPER_AGE_BOUND)
    error("Age must be between %d and %d.", LOWER_AGE_BOUND, UPPER_AGE_BOUND);

Имена хитрые. Какое собственное имя? Обычно используемая форма - Приветствие (Mr./Mrs./Miss), Имя и Фамилия / Фамилия. Это охватывает много культур. Не забывайте принимать во внимание язык. Мистер = герр, миссис = фрау, мисс = Фрейлейн, например, по-немецки. Кроме того, некоторые культуры предпочитают фамилии перед именами в формах (например, в Японии). Каковы ваши требования? Вам нужно учитывать все культуры или только несколько?

1 голос
/ 06 января 2011

Для имени сохраните пользовательский ввод в строку. Пройдите через строку и скажите ошибку, если элементы массива не от 'a' до 'z' или от 'A' до 'Z'. Что касается возраста, вы можете использовать массив символов или целое число. При использовании целого числа, если пользователь вводит 'a', будет принято значение ascii. Но если вы используете массив символов, вы можете видеть только цифры и с ограничением.

int main ()

{

char name[10],age[2];
int i;
printf("Enter name and age \n");
scanf("%s %s",name,age);
for(i=0; name[i]!=NULL; i++)
    if(isdigit(name[i]))
        printf("Error, name in aplahbets\n");
for(i=0; age[i]!=NULL; i++)
    if(isalpha(age[i]))
        printf("Error, age in numbers\n");

// Rest of your code Your code 
return 0;

}

0 голосов
/ 19 мая 2012

Без какой-либо проверки на возраст или переполнение можно получить короткое решение:

char name[40];
unsigned age;

if( scanf("%39s%u",name,&age)==2 )
  printf("name=%s age=%u",name,age);
else
  puts("input invalid");

Вы должны когда-либо проверить возврат от любых пользовательских данных.

0 голосов
/ 06 января 2011

Обычный способ проверки ввода состоит в том, чтобы прочитать входные данные в виде строки в программе, а затем проверить ее и преобразовать в ожидаемый тип.

Для имен не так много полезной проверки, которую вы можете сделать. Вы можете (и должны) проверить, что ввод не превышает ваши ожидания, но в остальном большинство входных данных следует рассматривать как действительное имя.

Для возраста, вы можете сделать гораздо больше проверок. Во-первых, входное значение должно быть допустимым целым числом, а во-вторых, оно должно находиться в определенном диапазоне.

Вы можете использовать следующие функции:

char* readString(char* buffer, size_t buflen)
{
  char* result;
  result = fgets(buffer, buflen, stdin);

  if ((result != NULL) && 
      (strlen(result) == buflen-1) &&
      (result[buflen-2] != '\n'))
  {
    /* too long a line */

    /* read the remainder of the line, to clear the input buffers */
    while ((result != NULL) && (result[strlen(result)-1] != '\n'))
    {
      result = fgets(buffer, buflen, stdin);
    }

    /* set result to NULL to indicate an error */
    result = NULL;
  }

  if (result != NULL)
  {
    /* strip the newline */
    result[strlen(result)-1] = '\0';
  }
}

bool readInt(int low, int high, int* value)
{
  char temp[80];

  if (readString(temp, 80))
  {
    char* endp;
    long result = strtol(temp, &endp, 10);
    if ((*endp == '\0') && (result >= low) && (result <= high))
    {
      *value = result;
      return true;
    }
    else
    {
       return false;
    }
  }
  else
  {
    return false;
  }  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...