gpt4 book ai didi

linux 下使用 read() 混淆 getchar

转载 作者:行者123 更新时间:2023-11-30 14:24:16 25 4
gpt4 key购买 nike

  1. 为什么我们要写 *bufp = buf 因为两者都是数组,所以在我看来应该是:

    static char bufp = buf;
  2. *bufp 如何“知道”从哪个位置开始显示?它不会以任何方式初始化为零。将 buf 分配给 bufp 后,我希望在返回行中它以最后输入的字符开头。

  3. 这里使用 unsigned char 修饰符只是为了省略输入的 -1 的情况 - 在大多数系统上意味着 EOF 吗?

    <
#include "syscalls.h"
/* getchar: simple buffered version */
int getchar(void)
{
static char buf[BUFSIZ];
static char *bufp = buf; /* [1] */
static int n = 0;
if (n == 0) { /* buffer is empty */
n = read(0, buf, sizeof buf);
bufp = buf; /* ? [1] here it is written like in my question so which is true ? */
}
return (--n >= 0) ? (unsigned char) *bufp++ : EOF; /* [2] & [3] */
}

最佳答案

[1] char bufp = buf是不正确的,因为 buf 是一个 char 数组(并且内部是一个地址,即指针的内容),并且 char bufp将宣告一个独特的性格。 char *bufp相反,是一个指向字符的指针(指向第一个字符,但您也可以访问下一个字符)。

[2] bufp指向buf数组,即它的第一个字符,位于开头。和n设置为0bufp , bufn都是静态的,这意味着它们在函数返回后“存活”——它们的每个值在程序加载时被初始化,然后每次调用函数时不再执行初始化。因此,它们“记住”缓冲区的状态:

`n` is the number of characters in the buffer, ready to be returned one by one,

`bufp` points to the next character to be returned (when n > 0),

and `buf` the array just holds the characters in the buffer.

所以要回答你的[2]问题,

  • 当没有可用字符时(n == 0),调用 read填充缓冲区bufbufp指向该数组的开头。
  • 那么只要缓冲区字符还没有一一全部返回(n > 0),*bufp是要返回的下一个字符; *bufp++给出要返回的字符并递增 bufp指针加一。

[3] unsigned修饰符阻止编译器传播 *bufp字符(8 位)符号到 int其他字节(通常为 32 位,即 24 个最高有效位),因为 int被返回。因此, 127(对于无符号字符,或负数对于有符号字符)的任何字符都将按原样返回(例如, (unsigned char)200 将作为 (int)200 返回)。

关于linux 下使用 read() 混淆 getchar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12019447/

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