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

1 篇文章 0 订阅
运行环境:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值