运行环境:
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