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并传递给数组读取函数?
谢谢大家的帮助!
谢谢 - 我结束了使用这条线,因为它似乎是最通用的。从非数字输入设置不同的返回值,因为我认为空白输入与错误的输入类型是不同的问题。 – 2012-01-02 21:27:31
“strlen(a)== 0”是一种矫枉过正(在某些情况下可能会降低性能)。 “a [0] =='\ 0'”要快得多 - 为什么要一直到字符串的最后,才知道它是空的? – ugoren 2012-01-02 21:37:00
@ ugoren点了。我现在认识到,验证依赖于get_line,我读过的对于除main()之外的任何东西都是不好的形式,但一次只能一步,等等。 – 2012-01-03 04:54:53