2012-01-02 60 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 
}