c - C - 对标准输入使用 getchar 而不是 fgets
问题描述
新来的,
与读取字符串相比,使用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;
}
解决方案
getchar()
与读取字符串相比,使用方法 是否有任何缺点fgets()
,除了仅从标准输入读取的事实,getchar()
因为我们可以为fgets()
.
是的。
fgets()
在一般情况下只需要一次调用,它会自动处理识别行尾。getchar()
一般情况下需要循环调用,需要自己处理行终止识别。这使得getchar()
使用起来更加复杂,并且为此目的成本更高。此外,如果您的程序中有多个地方要读取字符串,您可能希望将任何
getchar()
基于 - 的解决方案放入 afunction
中,以便您可以重用它,然后您就可以直接重新实现fgets
。期望编写和调整您的 C 库的专家的实现
fgets()
效率比您通过滚动您自己的getchar()
.
我看到的一个优点
getchar()
是fgets()
要求我们预先指定可以读取的最大字符数,而我们可以使用缓冲区getchar()
来存储字符串并根据需要重新分配。
如果您的意思是 usinggetchar()
允许您逐个字符地重新分配,那么
- 从技术上讲,您也可以使用
fgets()
. - 您通常希望以更大的块执行(重新)分配,因为它很昂贵。您也可以与结合使用
fgets
。
推荐阅读
- ruby-on-rails - ruby on rails 我需要从 api 数据构建一个对象
- c# - 从 WebApi 中的 json 对象列表中删除引用 $id
- c++ - 如何在 cmake 中通过 g++ 编译器查找默认支持的 C++ 标准
- excel - 如何根据两个不同的标准(一个是日期)自动对 Excel 中的行进行编号?
- reactjs - 在 React 的 getDerivedStateFromProps 中有多个条件
- c# - 匹配返回捕获但不匹配模式
- linux - 在每个匹配的模式之后 Sed/AWK 搜索/替换字符串
- javascript - Javascript 未在 HTML 中调用
- c# - 如何在 HoloLens 模拟器上运行 windows 应用程序包项目?
- php - Symfony 4 FosUserBundle 控制器装饰