fgets函數規範的字符串輸入函數

今天在寫測試代碼時,使用了gets函數來獲取輸入的字符串,結果出現了異常警告:
這裏寫圖片描述
gets函數危險的地方在於:它不知道緩衝區有多大,它會一直讀取數據放到緩衝區,直到出現換行符(’\n’)或者遇到EOF纔會停止。這樣很容易造成緩衝區的溢出。
使用fgets可以避免緩衝區異常的危險,但是卻將換行符’\n’,也讀入到字符串中,因此需要對fgets函數進行封裝(wrapper)。

char buffer[BUFSIZ];

while (fgets(buffer, sizeof(buffer), stdin) != 0)
{
    ...process line of data...
}

進行封裝:

char *fgets_wrapper(char *buffer, size_t buflen, FILE *fp)
{
    if (fgets(buffer, buflen, fp) != 0)
    {
        size_t len = strlen(buffer);
        if (len > 0 && buffer[len-1] == '\n')
            buffer[len-1] = '\0';
        //清空剩餘的數據
        else{
             int ch;
             while ((ch = getc(fp)) != EOF && ch != '\n')
                 ;
        }
        return buffer;
    }
    return 0;
}

代碼引自:http://stackoverflow.com/questions/1694036/why-is-the-gets-function-so-dangerous-that-it-should-not-be-used
PS:什麼是緩衝區?
它是包含相同數據類型實例的一個連續的計算機內存塊。是程序運行期間在內存中分配的一個連續的區域,用於保存包括字符數組在內的各種數據類型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章