您的位置:首页 > 编程语言 > C语言/C++

区分C语言中getch、getche、fgetc、getc、getchar、fgets、gets函数

2013-12-07 21:52 537 查看
两个原帖:区分C语言中getch、getche、fgetc、getc、getchar、fgets、gets
getch
getchegetchar的区别和缓冲区的概念


getch()

  所在头文件:conio.h

  函数用途:从控制台读取一个字符

  函数原型:int
getch(void)

  返回值:读取的字符

  例如:

  charch;或int
ch;

  getch();或ch=getch();

  用getch();会等待你按下任意键,再继续执行下面的语句;

  用ch=getch();会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句。

  易错点:

  1.所在头文件是conio.h。而不是stdio.h。

  2.在使用之前要调用initscr(),结束时要调用endwin()。否则会出现不输入字符这个函数

  也会返回的情况。

  3.在不同平台,输入回车,getch()将返回不同数值,而getchar()统一返回10(即\n)

  1)windows平台下ENTER键会产生两个转义字符\r\n,因此getch返回13(\r)。

  2)unix、linux系统中ENTER键只产生\n,因此getch返回10(\n)。

  3)MACOS中ENTER键将产生\r,因此getch返回13(\r)。

  getch();并非标准C中的函数,不存在C语言中。所以在使用的时候要注意程序的可移植性。国内C语言新手常常使用getch();来暂停程序且不知道此函数来源,建议使用getchar();(如果情况允许)代替此功能或更换一款编译器。


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

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

intgetche(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中。
intfgetc(FILE*stream);//从流stream中读一个字符。可以将标准输入stdin作为它的实参,这时候从标准输入读取一个字符。

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

intgetchar(void);    //从标准输入stdin读入一个字符,程序等待你输入的时候,你可以输入多个字符,回车后程序继续执行。

//但getchar只读入一个字符

说明:getc、getchar都是通过宏定义借助fgetc实现。如getchar的实现为,#definegetchar()fgetc(stdin)。


char*fgets(char*str,intnum,FILE*stream);

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

                //自动加上'\0'空字符结尾

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

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


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


main()

{

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

...

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

}

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

另外,绝大多数的这些get函数,都有对应的put版本。
int
fputc(
intcharacter,FILE*stream);
int
putc(
intcharacter,FILE*stream);//通过宏定义和fputc实现
intputchar(intcharacter);        //通过宏定义实现:#defineputchar(c)fputc(c,stdout)

int
fputs(constchar*
str,FILE*stream);
int
puts(constchar*
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)时,表示读入的已不是正常的字符,而是文件结束符。但以上只适用于读取文本文件的情况。现在ANSIC已经允许用缓冲文件系统处理二进制文件,而读入某一个字节中的二进制数据的值有可能是-1,而这又恰好是EOF的值。这就出现了需要读入有用数据,却处理为“文件结束”。feof(fp)
用来测试fp所指向的文件当前状态是否是“文件结束”。如果想顺序读入一个二进制文件数据,可以:

while(!feof(fp)){

c=fgetc(fp);

...

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: