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