c - getchar() 函数是否有自己的缓冲区来存储剩余的输入?

标签 c kernighan-and-ritchie

我正在阅读 K&R 的“C 编程书籍”。 现在函数“getint()”的代码如下:-->

#include<stdio.h>

#define BUFSIZE 100

char buf[BUFSIZE];
int bufp = 0;

int getch(void) {
    return (bufp > 0)?buf[--bufp]:getchar();
}

void ungetch(int c) {
    if(bufp >= BUFSIZE)
        printf("ungetch: too many characters\n");
    else
        buf[bufp++] = c;
}

int getint(int *pn) {
    int c, sign;

    while(isspace(c = getch()));

    if(!isdigit(c) && c != EOF && c != '-' && c != '+') {
        ungetch(c);
        return 0;
    }

    sign = (c == '-')?-1:1;
    if(c == '+' || c == '-')
        c = getch();

    *pn = 0;
    while(isdigit(c)) {
        *pn = (*pn * 10) + (c - '0');
        c = getch();
    }

    *pn *= sign;

    if(c != EOF)
        ungetch(c);


    return c;
}


int main(int argc, char** argv) {

    int r, i;

    while((r = getint(&i)) != EOF)
        if(r != 0)
            printf("res: %d\n", i);

    return 0;
}

现在我不明白这个函数的逐步工作过程,尽管我尝试在论文上理论上运行它。

事实上,当我输入“23”时。它如何转换为 23 ,我知道有将“23”转换为 23 的逻辑,但 c = getch() 在输入后不会将剩余的“3”存储在缓冲区中,那么它如何在期间返回 3转换。 getchar() 是否有自己的缓冲区,用于存储所有 inout 字符并一一获取它们。 非常感谢任何帮助。

最佳答案

在您提供的代码片段中,主要逻辑在这里:

1. *pn = 0;
2. while(isdigit(c)) {
3.     *pn = (*pn * 10) + (c - '0');
4.     c = getch();
5. }

pn是一个缓冲区,它将保存整数的最终值和 c是每次读取的字符,一个一个的,由getchar() 。因此,当您阅读“23”时,会发生以下情况:

  1. '2'被读到c
  2. pn = 0; c = '2';在第 3 行(来自带有主逻辑的代码片段),我们将缓冲区中的值乘以 10 并添加 ( 0x32 - 0x30 )
  3. pn = 2; c = 2;
  4. 阅读'3'c
  5. 乘法pn通过10给你20 ,添加 ( 0x33 - 0x30 ),就得到了最后的 23。

注意事项:

  • getchar()从标准输入中一一读取字符
  • 添加简单printf()语句将帮助您理解程序的流程
  • 尝试在 gdb 下运行它,检查变量的值

关于c - getchar() 函数是否有自己的缓冲区来存储剩余的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45238997/

相关文章:

c++ - 您建议使用什么方法在您正在构建的跨平台库中进行操作系统 API 调用?

c - K&R 1.9\\超出数组范围?

来自 K&R 的字符计数示例

c - 在 C 中显示#define 值

c - 用作 bash 系统调用的 strcat 结果不喜欢 & 符号

c - dlsym 返回 NULL,即使该符号存在

c - 如何使用按位运算来补充最右边的位以保持前导零位为零?

与 K&R 的 malloc 实现混淆

c - K&R 中边界有限的 qsort |排序过程不会在字符串中的下一个位置继续

c - 如何模拟 EOF?