односимвольный ввод пользователя и fgets - PullRequest
2 голосов
/ 02 января 2012

Вопрос Noob здесь, но я учу себя C и пытаюсь понять ввод пользователя безопасным, правильным способом (для справки это упражнение с массивом кода Морзе в Учебном руководстве по программированию GNU C на 10.6 (58-59) и15.5.5 (107)).

Мой желаемый поток программ:

  • запросить пользователя для одной цифры
  • получить ввод пользователя
  • проверить ввод пользователя
  • , если допустимый элемент массива правильной печати

Проблема в том, что если пользователь просто вводит жесткий возврат, функция чтения массива считывает и печатает из my_array [0].Я не могу понять, как заставить возврат завершиться неудачей проверки.

в основном:

if (get_line (digit_input, sizeof (digit_input), stdin) != NULL ) {
  if (validate (digit_input) == 0) {
    digit = atoi (digit_input);
    printf("\nThe Morse code for %d is: ", digit);
    morse(digit);
}

get_line и проверки функций:

char *get_line(char *s, size_t n, FILE *f) {
  unsigned int last;
  char *p = fgets (s, n, f);

  if (p != NULL) {
    last = (strlen(s) - 1);
    if (s[last] == '\n') s[last] = '\0';
  }
  return p;
}

int validate(char *a) { 
  unsigned x;

  for (x = 0; x < strlen(a); x++)
    if ( !isdigit(a[x]) || (a[1] != '\0' )) return -1;

  return 0;
}

Как я могу сделать недействительным ввод?(т. е. если строка читает \ n \ 0?) И почему входные данные без символов (т. е. \ n) превращаются в 0 и передаются в функцию чтения массива?

Спасибо всем за помощь!

Ответы [ 3 ]

1 голос
/ 02 января 2012

Ваша функция validate вернет 0, если strlen() равно 0, а это не то, что вам нужно.

0 голосов
/ 02 января 2012

Добавьте следующий тест в начале функции validate:

if (strlen(a) == 0) return -1;

Таким образом, пустой ввод будет недействительным.

0 голосов
/ 02 января 2012

Правильно ли я понимаю, что вы ожидаете, что будет введена ровно одна цифра?

Просто явно проверьте, что длина строки ровно 1, а символ представляет собой цифру:

int validate(char *a) { 
  return strlen(a)==1 && isdigit(a[0]) ? 0 : -1
}
...