C-在fgets上将getchar用作stdin

时间:2018-08-21 15:59:16

标签: c stdin fgets getchar

新来的

使用getchar()方法而不是fgets()来读取字符串是否有任何缺点,除了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;
}

1 个答案:

答案 0 :(得分:1)

  

使用getchar()方法相对于   fgets()用于读取字符串,而不是getchar()   仅从stdin读取,因为我们可以为fgets()选择流。

是的

  • fgets()在通常情况下仅需要一个呼叫,并且会自动识别行尾。一般情况下,getchar()需要在循环中调用,并且您需要自己处理行终止识别。这使得getchar()使用起来更加复杂,并且为此目的也更加昂贵。

  • 此外,如果程序中要读取字符串的位置不止一个,则需要将任何基于getchar()的解决方案放入function中,以便您可以重复使用它,然后无论如何您都会直接自己复制fgets

  • 也有理由期望,编写和调整您的C库的专家实现fgets()的效率要比您合理地期望与getchar()匹配时要高。 / p>

  

我看到的getchar()的一个优势是fgets()要求我们   指定高级可以读取的最大字符,而   我们可以在getchar()的情况下使用缓冲区来存储字符串和   根据我们的需要重新分配。

如果您的意思是使用getchar()可以逐个字符地重新分配

  1. 从技术上讲,您也可以使用fgets()来实现。
  2. 您通常要在较大的块中执行(重新分配),因为这很昂贵。而且,您也可以结合fgets进行