单字符用户输入和fgets

时间:2012-01-02 17:53:07

标签: c validation user-input fgets

Noob在这里提出问题,但我正在教自己C并试图以安全,正确的方式找出用户输入(参考这是在10.6(58-59)的GNU C编程教程中的莫尔斯代码数组练习和15.5.5(107))。

我想要的程序流程是:

  • 提示用户输入单个数字
  • 获取用户输入
  • 验证用户输入
  • 如果有效打印正确的数组项

问题是如果用户只是输入硬回车,则数组读取功能会从my_array [0]读取并打印。我无法弄清楚如何使返回失败验证。

在main中:

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 个答案:

答案 0 :(得分:1)

如果validate为0,则strlen()函数将返回0,这不是您想要的。

答案 1 :(得分:0)

我是否正确理解您希望输入一个数字?

只需明确检查字符串的长度是否正好为1,字符是数字:

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

答案 2 :(得分:0)

validate函数的开头添加以下测试:

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

因此,空白输入将无效。