首页 > 解决方案 > C - 对标准输入使用 getchar 而不是 fgets

问题描述

新来的,

与读取字符串相比,使用getchar()方法是否有任何缺点,除了仅从哪里读取,因为我们可以为.fgets()getchar()stdinfgets()

假设,我只需要与 一起工作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;
}

标签: cstdinfgetsgetchar

解决方案


getchar()与读取字符串相比,使用方法 是否有任何缺点fgets(),除了仅从标准输入读取的事实,getchar() 因为我们可以为fgets().

是的。

  • fgets()在一般情况下只需要一次调用,它会自动处理识别行尾。 getchar()一般情况下需要循环调用,需要自己处理行终止识别。这使得getchar()使用起来更加复杂,并且为此目的成本更高。

  • 此外,如果您的程序中有多个地方要读取字符串,您可能希望将任何getchar()基于 - 的解决方案放入 afunction中,以便您可以重用它,然后您就可以直接重新实现fgets

  • 期望编写和调整您的 C 库的专家的实现fgets()效率比您通过滚动您自己的getchar().

我看到的一个优点getchar()fgets()要求我们预先指定可以读取的最大字符数,而我们可以使用缓冲区getchar()来存储字符串并根据需要重新分配。

如果您的意思是 usinggetchar()允许您逐个字符地重新分配,那么

  1. 从技术上讲,您也可以使用fgets().
  2. 您通常希望以更大的块执行(重新)分配,因为它很昂贵。您也可以结合使用fgets

推荐阅读