【问题标题】:C - Using getchar over fgets for stdinC - 对标准输入使用 getchar 而不是 fgets
【发布时间】:2018-08-21 15:59:15
【问题描述】:

这里是新的,

使用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;
}

【问题讨论】:

  • 它们是完全不同的东西,最好的使用完全取决于你在做什么。
  • 你考虑过scanf吗?
  • 如果你想从指定的流中读取单个字符,有fgetc
  • 我知道getchar() 使用fgetc() 但我的问题很清楚“是否有理由更喜欢其中一个,只要它们都足以完成手头的任务。”
  • 如果输入字符串使用基于字符串的函数。如果输入字符使用基于字符的函数。你在做什么?

标签: c stdin fgets getchar


【解决方案1】:

使用getchar() 方法有什么缺点吗? fgets() 用于读取字符串,而不是 getchar() 仅从标准输入读取,因为我们可以为fgets() 选择一个流。

是的。

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

  • 1234563那么你就可以直接重新实现fgets了。
  • 也有理由期望编写和调整 C 库的专家实现 fgets() 的效率比您通过滚动自己的 getchar() 来匹配的效率更高。

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

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

  1. 从技术上讲,您也可以通过 fgets() 获得。
  2. 您通常希望以更大的块执行(重新)分配,因为它很昂贵。您也可以与fgets 一起这样做

【讨论】:

  • 我现在看到的方式是,我几乎总是更喜欢fgets() 而不是getchar(),除非我想在分配字符时对它们执行操作。 (严格按照上面的例子来说。)
  • @ShauryaSingh,是的,对于阅读 字符串,尤其是整行字符串,我同意 fgets() 通常是首选。 getchar() 有不同的用途。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
相关资源
最近更新 更多