C语言如下代码:没有标准输入函数,他是怎么实现输入的

BadBlood1984
  • 102
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
int get_word(char *buf,int buf_size,FILE *fp)
{
    int len;
    int ch;
    /*跳过读取空白字符*/
    while((ch = getc(fp)) != EOF && !isalnum(ch))

    if (ch == EOF)
        return EOF;
    /*此时,ch中保存了单词的初始字符。*/
    len = 0;
    do {
        buf[len] = ch;
        len++;
        if (len >= buf_size)
        {
            /*由于单词太长 提示错误*/
            fprintf(stderr,"word too long.\n");
            exit(1);
        }   
    }while((ch = getc(fp)) != EOF && isalnum(ch));
    buf[len] = '\0';
    return len;
}
int main()
{
    char buf[256];

    while (get_word(buf,256,stdin) != EOF)
    {
        printf("<<%s>>\n",buf);
    }
    return 0;
}
回复
阅读 4.6k
5 个回答

FILE *是文件指针类型,可以用来读写文件或者进行其他I/O工作。
C语言中有stdin, stdout, stderr三个FILE *类型的全局变量,分别是标准输入,标准输出,标准错误输出,在程序启动时由C运行库加载。
默认情况下,一般标准输出和标准错误输出都是屏幕,标准输入是键盘。

char getc(FILE *stream);
char fgetc(FILE *stream);  // 二者等价

这个函数从fp这个文件指针中读取一个字符并返回。get_word参数中传入的fp参数是stdin即键盘,所以getc(fp)就是从键盘读入一个字符,当然就实现输入了。

其实一般scanf和gets这两个输入函数最终还是要调用到getc(stdin)的。

不同的操作系统提供了不同的输入函数接口 比如linux之类的os提供了posix接口read 比如c语言标准库实现libc就是给这些操作系统提供的接口进行了封装 所以最后这些输入函数还是调用操作系统的read接口实现输入

每个进程会有三个默认的FILE*
stdin, 标准输入
stdout, 标准输出
stderr, 标准错误输出

Unix平台每个进程默认都会打开三个句柄:stdin stdout 和stderr ,用户使用完毕时也无需手动fclose,进程结束时系统会自动回收。系统默认情况,stdin标准输入指向终端交互设备。请楼主参考《Unix环境高级编程》。

ch = getc(fp)

从文件中读入字符, fp传进来的实参是stdin,就是从标准输入中读入了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏