gpt4 book ai didi

c - 使用 read 实现 getchar

转载 作者:太空宇宙 更新时间:2023-11-04 03:57:04 25 4
gpt4 key购买 nike

我试图在 unistd.h 中使用 read() 来实现 getchar() 函数。

由于系统调用很昂贵,我想尽可能少执行 read() 函数。

如果我使用“getchar”,它工作正常。但是,“mygetchar”在这种情况下不起作用。

谁能指出我在下面做错了什么?

#include <stdio.h>
#include <unistd.h>

#define BUF_SIZE 1024

int startIndex;
int endIndex;

int mygetchar(void){
char buffer[BUF_SIZE];
startIndex=0;
endIndex=0;
if(startIndex == endIndex){
int r;
r = read(0,buffer,BUF_SIZE);
startIndex=0;
endIndex=r;
}
return buffer[startIndex++];
}


int main(){
char c;
int i=0;
do{
c = mygetchar();
putchar(c);
i++;
}
while(c != EOF);
return 0;
}

最佳答案

仔细考虑您的缓冲区。当函数调用结束时缓冲区会发生什么?它消失了。

这意味着对于 1024 次调用中的 1023 次,您的缓冲区被初始化并且您的偏移量指向无意义的数据。


基本上你也需要一个缓冲区的全局变量:

static char buf[BUF_SIZE];
static size_t bufCur = 0;
static size_t bufEnd = 0;

int mygetchar(void)
{
// ...
}

(请注意,当您的代码都在一个文件中时,static 几乎毫无意义。如果您要将 mygetchar 拉入头文件和实现文件中,您可能希望使用 static global 以防止它可从同一编译单元外部链接。)

(有趣的事实:bufCurbufEnd0 实际上可以隐式保留。为了清楚起见,我会把它们放在一起,但是standard dictates 它们将被零初始化。


正如 Jonathan Leffler 指出的那样,除非您计划在其他地方使用缓冲区(而且我不知道那会在哪里),否则不需要全局的。您可以只在函数内部使用静态变量:

void mygetchar(void)
{
static buf[BUF_SIZE];
static size_t bufCur = 0;
static size_t bufEnd = 0;
// ...
}

关于c - 使用 read 实现 getchar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15514068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com