请问:关于C语言中getc(stdin) 读取键盘缓冲区的问题?
发布网友
发布时间:2022-10-23 03:58
我来回答
共3个回答
热心网友
时间:2024-01-06 18:48
getc(stdin)每次只能从缓冲区读取一个 字符,但是遇到回车符就结束了。连续从缓冲区读取循环此段代码。同样以回车结束。#include<stdio.h>void main(void)
{while(1){
char a;
a=getc(stdin);
printf("%c",a);}} 这是编译器内部定义的函数,他在头文件里的定义可以再函数名上击右键选getc定义查看,但是内部实现看不到。下面是截取了stdio.h里的一段定义。
_CRTIMP int __cdecl _flushall(void);
_CRTIMP FILE * __cdecl fopen(const char *, const char *);
_CRTIMP int __cdecl fprintf(FILE *, const char *, ...);
_CRTIMP int __cdecl fputc(int, FILE *);
_CRTIMP int __cdecl _fputchar(int);
_CRTIMP int __cdecl fputs(const char *, FILE *);
_CRTIMP size_t __cdecl fread(void *, size_t, size_t, FILE *);
_CRTIMP FILE * __cdecl freopen(const char *, const char *, FILE *);
_CRTIMP int __cdecl fscanf(FILE *, const char *, ...);
_CRTIMP int __cdecl fsetpos(FILE *, const fpos_t *);
_CRTIMP int __cdecl fseek(FILE *, long, int);
_CRTIMP long __cdecl ftell(FILE *);
_CRTIMP size_t __cdecl fwrite(const void *, size_t, size_t, FILE *);
_CRTIMP int __cdecl getc(FILE *);//////////////////////////这里定义了getc();
_CRTIMP int __cdecl getchar(void);
getc()中的参数FILE定义:#ifndef _FILE_DEFINED
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif
热心网友
时间:2024-01-06 18:48
如果是在操作系统上运行,从键盘缓冲区到文件,基本是操作系统干的
所以,getch只是从文件里把字符读出来,c运行库也会通过FILE 结构管理文件的信息,包括里面的缓冲区,所以getch就是从FILE结构体的缓冲区里面读。 原理基本就是你写的那样。
热心网友
时间:2024-01-06 18:49
这个过程很复杂,新人最好先不要深入这个底层的知识。我简单的解释一下这个过程。getc函数接受参数fp是一个文件的流,内含一个指针是用来指向内存里的缓存,读一个字符以后,指针+1然后继续读next。如果以后你学的比较熟练了,可以仔细阅读stdio..h的源代码。