6.16 C语言,getchar gets getc有什么区别 分别是表示什么的

6.16 C语言,getchar gets getc有什么区别 分别是表示什么的,第1张

区分C语言中getch、getche、fgetc、getc、getchar、fgets、gets首先,这两个函数不是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 )//从标准输入stdin读入一个字符,程序等待你输入的时候,你可以输入多个字符,回车后程序继续执行。 //但getchar只读入一个字符说明:getc、getchar都是通过宏定义借助fgetc实现。如getchar的实现为,#define getchar() fgetc(stdin)。 char * fgets (char * str, int num, FILE *stream)//从流stream中读入最多num个字符到字符数组str中,当遇到换行符时、或读到num-1个字符时停止。 //自动加上'\0'空字符结尾char * gets ( char * str ) //从标准输入stdin读取一个字符串,遇到换行或结束时候终止。 //不同于fgets,他没有指定num,所以需要注意字符数组str的大小。 说明: fgets和gets之间没有宏定义的关系,彼此各自有自己的实现。蠕虫病毒的实现就是函数gets的“功劳”。gets函数的任务是从流中读入一个字符串。它的调用者会告诉它把读入的字符串放在什么地方。但是,gets()函数并不检查缓冲区大小,如果调用者提供了一个指向堆栈的指针,并且get()函数读入的字符数量超过了超过了缓冲区的空间大小,get()会愉快地将多出来的字符继续写入到堆栈中,这就覆盖了堆栈中原来的内容。如:main()

{

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

...

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

}

建议不要用getch和getche,因为它们不是C标准库中的函数。用它们写出的程序可移植性差,不同的编译器不保证可以包含conio.h。建议用fgets函数彻底替代gets函数。

要想理解这个,你一定要忘记你平时

写代码的时候

按下回车的时候,文本框中的反应,

因为那个不是回车,

标准的说

是"回车

+ 换行"

回车的真正反应是

光标置于当前的最开头而已

在getchar()

函数中作用确认的作用.

当时在文本编辑中

回车符,

仅仅是将光标放在当前行的行首

换行符仅仅是将当前光标的位置下移一行,并不会出现在下一行的行首, 仅仅的是往下移动一行而已,就相当于

光标坐标

y

1

而x不变一样.

c语言中在读取键盘数据时,一般是带缓存的数据输入,需要按回车键才能完成该“行”数据的输入确认。

而 scanf()函数对这个回车确认符并不进行处理,回车符会留在输入缓存区中。

因此,在下一个读“字符” *** 作函数(getchar, scanf("%c"), gets()等)运行时,会读到这个字符。

而在读数值型数据或字符串时,scanf()会从第一个非空白字符(空白字符指:回车,空格,TAB键)开始读取,自动忽略前面的空白字符,而遇到空白字符结束该类型数据的输入。

因此,是否一定要在scanf后面跟个 getchar吃回车,要看下一个输入的数据类型是什么,如果是读字符类 *** 作,处理办法有多种方式:

一、用fflush(stdin)命令强行刷新输入缓存,丢弃输入缓存中的数据,此种方法在windows下使用有效,linux无效。

char ch

fflush(stdin) //不管缓存中有没有数据,强行清除

ch=getchar() //这里会等待用户输入一个字符

二、前面有读数据 *** 作,现在要执行读字符 *** 作,则可用getchar()来吃掉前面的回车确认

int i

char ch

scanf("%d", &i ) //读一个整数,回车确认

getchar() //先吃掉回车确认符,这两句,效果同下一方法的那一句

ch=getchar() //这里会等待用户输入一个字符

三、在scanf()书写上做文章,如:读一个数据,以回车确认,则输写成如下格式

int i

char ch

scanf("%d%*c", &i ) //%*c表示读一个字符,并不赋值给任何变量

ch=getchar() //这里不会读到回车符


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7148508.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-02
下一篇2023-04-02

发表评论

登录后才能评论

评论列表(0条)

    保存