我正在阅读 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”时,会发生以下情况:
-
'2'
被读到c
-
pn = 0; c = '2';
在第 3 行(来自带有主逻辑的代码片段),我们将缓冲区中的值乘以 10 并添加 (0x32 - 0x30
) -
pn = 2; c = 2;
- 阅读
'3'
到c
- 乘法
pn
通过10
给你20
,添加 (0x33 - 0x30
),就得到了最后的 23。
注意事项:
-
getchar()
从标准输入中一一读取字符 - 添加简单
printf()
语句将帮助您理解程序的流程 - 尝试在 gdb 下运行它,检查变量的值
关于c - getchar() 函数是否有自己的缓冲区来存储剩余的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45238997/