簡體   English   中英

C - 對 stdin 使用 getchar over fgets

[英]C - Using getchar over fgets for stdin

新來的,

fgets()相比,使用getchar()方法讀取字符串是否有任何缺點,除了getchar()僅從stdin讀取的事實之外,我們可以為fgets()選擇一個流。

假設我只需要使用stdin ,是否有理由我應該或不應該選擇其中之一?

我看到getchar()的一個優點是fgets()要求我們指定可以提前讀取的最大字符數,而在getchar()情況下,我們可以使用緩沖區來存儲字符串並根據需要重新分配.

[ 編輯 ]

我實現了這個函數來讀取輸入,但是如果知道字符串的長度, fgets()也可以滿足要求,是否有任何理由這樣做。

char *scanner ( const char *text )
{
    char *buffer = ( char * ) malloc ( sizeof ( char ) * BUFFER_SIZE );

    int token;
    int length = 0;
    int limit = BUFFER_SIZE;

    printf("%s", text);

    while ( ( token = getchar ( ) ) != '\n' && token != EOF )
    {
        buffer [ length ++ ] = token;

        if ( length > limit )
        {
            limit += 256;
            buffer = ( char * ) realloc ( buffer, sizeof ( char ) * limit );
        }
    }

    buffer [ length ] = '\0';

    return buffer;
}

fgets()相比,使用getchar()方法讀取字符串是否有任何缺點,除了getchar()僅從 stdin 讀取的事實之外,我們可以為fgets()選擇一個流。

是的。

  • fgets()在一般情況下只需要一次調用,它會自動處理識別行尾。 一般情況下需要在循環中調用getchar() ,需要自己處理行終止識別。 這使得getchar()使用起來更加復雜,並且為此目的成本更高。

  • 此外,如果您的程序中有多個地方您想讀取字符串,您可能希望將任何基於getchar()的解決方案放入一個function以便您可以重用它,然后您就可以直接使用您自己的無論如何重新實現fgets

  • 期望編寫和調整您的 C 庫的專家實現fgets()效率比您通過使用getchar()滾動您自己的庫所能合理期望的更有效也是合理的。

我看到getchar()的一個優點是fgets()要求我們指定可以提前讀取的最大字符數,而在getchar()情況下,我們可以使用緩沖區來存儲字符串並根據需要重新分配.

如果您的意思是使用getchar()允許您逐個字符地重新分配那么

  1. 從技術上講,您也可以使用fgets()獲得它。
  2. 您通常希望在更大的塊中執行(重新)分配,因為它很昂貴。 您也可以將fgets結合使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM