尴尬getch() 和getchar()的错误

xiaoxiao2021-02-28  18

运行环境:

Win10 ,Dev C,TDM-GCC-4.9.2-Release

出错代码:

...//Pointers on C ...//第一章 程序1.1 rearrange.c int read_columns_numbers(......){ ... ... ... while(( ch = getchar()) != EOF && ch != '\n' ) ; }

函数int read_columns_numbers()中将getchar() 写成getch()。

输入输出:

输入:1 2 3 -1时,与原设想一致; 输入:1 2 3 15 -1 按下回车后,按下键盘后控制台无显示。

分析:

getchar()函数原型:int getchar(void);

getchar由宏实现:#define getchar() getc(stdin)。getchar有一个int型的返回值。当程序调用getchar时.程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符。getchar函数的返回值是用户输入的字符的ASCⅡ码,如出错返回-1,且将用户输入的字符回显到屏幕。如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。

getch函数原型:int getch(void);

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

明白两者的返回值后就很容易理解明白程序的错误了。

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

因为ASCII码均大于0故不可能=EOF(#define EOF -1),ch!=EOF恒成立,ch!=’\n’也恒成立(getch()读取单键的ASCII码),陷入死循环。

奇怪点:

getch()需要包含头文件conio.h,而Dev_C++中,按下编译(F9)无警告。 在Code::Blocks中,按下build(或者Ctrl+F9)后有如下 warning:C:\ …ADDRESS…\proj00\main.c|43|warning: implicit declaration of function ‘getch’ [-Wimplicit-function-declaration] 怀疑devc++设置问题。

解决方法:

Dev中点击 运行->检查当前文件语法 或者 按Ctrl+F9 下方的编译器窗口就会显示相应的warning。

产生原因???:

dev中叫做编译(compile)生成.o文件。不过还是搞不懂为啥dev 的compile不包含语法检查非要另外设计成按Ctrl+F9(execute -> syntax check current file)…… codeblocks叫做build,包含compile + link

参考: getchar()百度百科 C library function - getchar() conio.h getch in c Difference between getc(), getchar(), getch() and getche() build和compile的区别[编程语言] compiler

转载请注明原文地址: https://www.6miu.com/read-1700137.html

最新回复(0)