首先,这两个函数不是C标准库中的函数:

int getch(void)    //从标准输入读入一个字符,当你用键盘输入的时候,屏幕不显示你所输入的字符。也就是,不带回显。

int getche(void)    //从标准输入读入一个字符,键盘输入的时候,屏幕显示所输入的字符。带回显。

这两个函数都不带缓冲区,其包含在头文件为conio.h,需要记住的是conio.h不是C标准库中的头文件。Micorsoft 和 Borland的 C编译器提供了conio.h,用来创建控制台文本用户界面。一般在Windows系统下安装了VS、VC等,就可以包含conio.h头文件。但是一般在Unix、Linux系统中,/usr/include/中都没有这个头文件。

getch和getche在等待用户从键盘输入的时候,用户按下一个键后,不需要按回车,程序自动往下执行。在Linux中,终端输入在缺省情况下是被“一锅端”的,也就是说整行输入是被一起处理的。通常,这是一种人们所希望的方便的办法,但它也意味着在读入数据时必须按一下回车键表示输入行结束后才能得到输入的数据。在游戏中,很多都提供了“老板键”,它的实现,就是利用了这两个函数。

其次,除了getch和getche,其他的都是C标准库中的头文件,包含在头文件stdio.h中。

int fgetc ( FILE * stream ); //从流stream中读一个字符。可以将标准输入stdin作为它的实参,这时候从标准输入读取一个字符。

int getc(FILE * stream);     //和fgetc等效,由fgetc通过宏实现。

int getchar ( void );    //getchar() 函数等待输入直到按回车 才结束(前提是缓冲区没有数据),回车前的 所有输入字符都会逐个显                             //示在屏幕上。但每次调用只读入 最开始的一个字符并将其作为函数的返回值 。

说明:getc、getchar都是通过宏定义借助fgetc实现。如getchar的实现为,#define getchar() fgetc(stdin)。对于getchar函数,因为我们输入的字符串并不是取了第一个字符就把剩下的字符串丢掉了,它还在我们的内存中,就好比,开闸放水,我们把水放到闸里去以后,开一次闸就放掉一点,开一次就放掉一点,直到放光了为止,这里开闸动作就相当于调用一次 getchar() 。我们输入的字符串也是这么一回事,首先我们 输入的字符串是放在内存的缓冲区 中的,我们调用一次 getchar() 就把缓冲区中里出口最近的一个字符输出,也就是最前面的一个字符输出,输出后,就把它释放掉了,但后面还有字符串,所以我们就用循环把最前面的一个字符一个个的在内存中释放掉,直到最后把回车符也放空为止,空了之后再在执行 getchar() 就停下等待你的输入了。

注意:

1.在windows环境下,按键盘上的回车产生了 2 个字符 : 回车符 ('\r') 和换行符 ('\n') 。回车符 '\r'(CR:carriage return: 倒车)使光标回到这行的首部,换行符 ('\n')(new line) 然后再换行。但是在linux环境下,按键盘上的回车只产生一个字符'\n'

2.如何清空输入缓冲区的内容?

如果我想让 getchar() 每次都能够等待用户输入的话就要清空缓冲区,下面就介绍方法(不同平台)

C标准规定 fflush()函数是用来刷新输出( stdout)缓存的。对于输入( stdin),它是没有定义的。 但是有些编译器也定义了 fflush(stdin ) 的实现,比如微软的 VC 。其它编译器是否也定义了 fflush(stdin) 的实现应当查找它的手册。 GCC 编译器没有定义它的实现,所以不能使用 fflush(stdin) 来刷新输入缓存。

对于没有定义 fflush(stdin) 的编译器,可以 使用 fgets()函数来刷新输入缓存 (比用 getchar() 、 scanf() 等函数通用性好)。可以这样忽略输入流中留下的回车等其它输入,从而使下一次的输入总保持一个 “ 干净 ” 的状态。(这个是任何平台下都可以的) // ...

char sbuf[1024];

// ...

fgets( sbuf, 1024, stdin );

// ...

在 windows的 vc 下面就可以这样了:

for(int i=0;i<10;++i)

{

char ch=getchar();

fflush(stdin); // 每次都会有等待状态了

}

fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符,读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。gets()若成功则返回s指针,返回NULL则表示有错误发生。

char * fgets (char * str, int num, FILE *stream);

//从流stream中读入最多num个字符到字符数组str中,当遇到换行符时、或读到num-1个字符时停止。

//读入的字符串中最后包含读到的换行符,自动加上'\0'空字符结尾

char * gets ( char * str ); //从标准输入stdin读取一个字符串,遇到换行或结束时候终止。

//不同于fgets,他没有指定num,所以需要注意字符数组str的大小。

//读入字符不包括最后的换行符,但自动加上'\0'空字符结尾

说明: fgets和gets之间没有宏定义的关系,彼此各自有自己的实现。蠕虫病毒的实现就是函数gets的“功劳”。gets函数的任务是从流中读入一个字符串。它的调用者会告诉它把读入的字符串放在什么地方。但是,gets()函数并不检查缓冲区大小,如果调用者提供了一个指向堆栈的指针,并且get()函数读入的字符数量超过了超过了缓冲区的空间大小,get()会愉快地将多出来的字符继续写入到堆栈中,这就覆盖了堆栈中原来的内容。如:

main()

{

char line[512];    //在程序的堆栈上分配512个字符的空间

...

gets(line);        //蠕虫病毒的入口,可以将恶意代码通过多出来的数据写入堆栈

}

建议不要用getch和getche,因为它们不是C标准库中的函数。用它们写出的程序可移植性差,不同的编译器不保证可以包含conio.h,其他的函数都是对流操作,都有相关缓冲区,此外建议用fgets函数彻底替代gets函数。

另外,绝大多数的这些get函数,都有对应的put版本。

int fputc ( int character, FILE * stream );

int putc ( int character, FILE * stream );       //通过宏定义和fputc实现

int putchar ( int character );        //通过宏定义实现:#define putchar(c) fputc(c, stdout)

int fputs ( const char * str, FILE * stream );

int puts ( const char * str );

说明:两者之间无宏定义实现关系。puts(const char *str)近似等效于fputs(cosnt char *str, stdout),不同点是前者还输出一个'\n'

最后,关于EOF

EOF是在stdio.h文件中定义的符号常量,值为-1。 如:

fputc函数返回一个值:如果输出成功则返回值就是输出的字符;如果输出失败,则返回一个EOF。

fgetc函数读字符时遇到文件结束符,函数返回一个文件结束标记EOF。如果想从一个磁盘文件顺序读入字符并在屏幕上显示,可以:

ch = fgetc(fp);

while(ch != EOF){

putchar(ch);

ch = fgetc(fp);

}

注意,EOF不是可输出字符,因此不能在屏幕上显示。由于ASCII码不可能出现-1,因此EOF定义为-1是合适的。 当读入的字符值等于-1(即 EOF)时,表示读入的已不是正常的字符,而是文件结束符。但以上只适用于读取文本文件的情况。现在ANSI C 已经允许用缓冲文件系统处理二进制文件,而读入某一个字节中的二进制数据的值有可能是-1,而这又恰好是EOF的值。这就出现了需要读入有用数据,却处理为“文件结束”。feof(fp) 用来测试fp所指向的文件当前状态是否是“文件结束” 。如果想顺序读入一个二进制文件数据,可以:

while(!feof(fp)){

c = fgetc(fp);

...

}

详情请查阅C标准库。

c语言getch获取换行符,区分C语言中getch、getche、fgetc、getc、getchar、fgets、g...相关推荐

  1. c语言gets与fgetc,区分C语言中getch、getche、fgetc、getc、getchar、fgets、gets 转

    首先,这两个函数不是C标准库中的函数, int getch(void) //从标准输入读入一个字符,当你用键盘输入的时候,屏幕不显示你所输入的字符.也就是,不带回显. int getche(void) ...

  2. 区分C语言中getch、getche、fgetc、getc、getchar、fgets、gets

    首先,这两个函数不是C标准库中的函数,    int getch(void) //从标准输入读入一个字符,当你用键盘输入的时候,屏幕不显示你所输入的字符.也就是,不带回显.  int getche(v ...

  3. C语言中getch()的用法

    C语言中getch()函数详解及简单实例 这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的C语言命令行程序会用到此函数做游戏,但是这个函数并非标准函数,要注意移植性!Wi ...

  4. c语言中getche的用法,c语言中getch的用法

    [www.hywsbj.com--图表展板] getch()函数是无回显的从控制台取得一个字符.以利用getch()函数让程序调试运行结束后等待编程者按下键盘才返回编辑界面,即任意键继续效果.下面小编 ...

  5. getch方法_c语言中getch的用法

    1 c 语言中 getch 的用法 getch() 函数是无回显的从控制台取得一个字符. 以利用 getch() 函数让程序调试运行结束后等待编程者按下键盘才返回编辑界面 , 即 任意键继续效果.下面 ...

  6. java 获取换行符_Apache POI从XWPFRun获得换行符

    我在使用Apache POI 3.15从docx文件中读取空格时遇到问题 . 我有一个带有换行符的Word文档,当通过apache poi读取文件时,我无法找到获取这些换行符的方法 . 当我调用 pa ...

  7. C语言编辑换行符怎么打,c语言中的换行符怎么打

    2016-08-12 15:54辛国海 客户经理 C语言中回车,换行,空字符与空格:fgets和gets在读取换行符的区别 摘要:C语言中,我们常常从终端输入,并且输出到终端,键盘上的回车,输入到缓冲 ...

  8. 每三个数换行 用C语言表示,关于换行符:使用fscanf()读取每行3个数字的文件,为什么“%d%d%d%* c”和“%d%d%d”一样好?...

    我知道%d格式说明符,当在fscanf()中使用时,会读取一个整数并忽略其前面的空白,包括换行符(我已对其进行了验证).但是在下面的程序中,我使用fscanf()来从多行(每个行包含3个整数)的文件读 ...

  9. c语言常量中有换行符,处理 Qt 中文提示 “常量中有换行符”

    在 Qt 自建的 Widget 窗口生成的 cpp 文件中,直接写中文编译时会提示错误.内容是 "常量中有换行符".如下图所示: 要解决这个问题很简单,使用 notepad++ 打 ...

最新文章

  1. 在CentOS 6.8 x86_64上安装nginx 1.10.3
  2. VC++ inline内联函数的作用解决方案
  3. 简单易懂棒棒哒的视频传输工具!
  4. Android应用启动后自动创建桌面快捷方式
  5. java 异常管理员_java web在进行管理员操作的时候,抛出了下面的异常,怎么解决啊...
  6. 摆脱困境:在每种测试方法之前重置自动增量列
  7. 不把C作为第一门语言是个好主意么?
  8. MySQL千万级访问量架构(转)
  9. messagebox弹窗_从案例入手学Python——检测文件生成并弹窗提醒
  10. solr学习篇(三) solr7.4 连接MySQL数据库
  11. 【转】三层架构的业务逻辑层存在的意义
  12. 附26页PPT下载|借助用户画像解决电商问题
  13. android 经纬度 谷歌,android:GPS获取location经纬度并用谷歌解析为地理位置名称
  14. 安卓投屏大师_好用的投屏软件合集—2020年
  15. web3.0是什么意思(web3和元宇宙的关系)
  16. 【Python 爬虫教程】代理ip网站有哪些?
  17. 厦门大学计算机科学与技术,计算机科学与技术博士培养-厦门大学计算机科学系...
  18. Pandas详解十之Dropna滤除缺失数据
  19. 5-32 哥尼斯堡的“七桥问题” (25分)
  20. 第三方支付-核心交易之商户结算设计

热门文章

  1. 第十四届大学生服务外包创新创业大赛总结和心得
  2. ubuntu 16.04 更改系统语言为简体中文
  3. bluestacks android 文件夹,BlueStacks怎么添加APK文件?蓝叠安卓模拟器安装apk图文教程...
  4. [C/C++]_[初级]_[ 线程pthread学习之互斥锁和条件变量的应用 ]
  5. 《IDC PeerScape:中国农村数字金融实践与案例》研究报告发布
  6. 控制器POX在windows下使用教程
  7. STM32-通行闸机2(HAL库)
  8. 首站告捷 | GBASE数据库中华行在穗城圆满落幕
  9. python correlation_python使用rabbitmq实例七,相互关联编号correlation id
  10. SPI NAND 读性能测试(含tRD_ECC)