2012-01-02 65 views
2

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

我的期望的程序流程是:

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

的问题是,如果用户只是输入一个硬回车,数组读取函数就会从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并传递给数组读取函数?

谢谢大家的帮助!

回答

0

添加下面的测试中validate功能的beggining:

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

所以,空白输入将失效。

+0

谢谢 - 我结束了使用这条线,因为它似乎是最通用的。从非数字输入设置不同的返回值,因为我认为空白输入与错误的输入类型是不同的问题。 – 2012-01-02 21:27:31

+0

“strlen(a)== 0”是一种矫枉过正(在某些情况下可能会降低性能)。 “a [0] =='\ 0'”要快得多 - 为什么要一直到字符串的最后,才知道它是空的? – ugoren 2012-01-02 21:37:00

+0

@ ugoren点了。我现在认识到,验证依赖于get_line,我读过的对于除main()之外的任何东西都是不好的形式,但一次只能一步,等等。 – 2012-01-03 04:54:53

1

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

0

我是否正确理解您期望输入一位数字?

就明确检查字符串的长度正好是1和焦炭是一个数字:

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