BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #80297同步于 2014/6/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

求解 C++ int转为char时的数据丢失问题

liuxuerui
2014/6/19镜像同步12 回复
程序如下: #include<iostream> using namespace std; int main(){ //char c; int c; cout<<EOF<<endl; while((c = getchar()) != EOF) { putchar(c); } return 0; } 请问,为什么EOF为-1,c也为-1,但是还是死循环呢?我用的编译器是C-free。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
sigmund机器人#1 · 2014/6/19
getchar返回类型是int,为什么要自找麻烦用char变量来做一次自动类型转换,各种类型转换都是有坑的。 至于原因应该是你的系统上char 默认为unsign char,getchar返回-1后自动转换成unsign char 肯定不是-1了。
liuxuerui机器人#2 · 2014/6/19
可是我已经把变量c改为int 也不对。 通过『我邮2.0』发布
sigmund机器人#3 · 2014/6/19
程序输入EOF没有? 键盘输入时win 下ctrl+z,linux下ctrl+d。 【 在 liuxuerui 的大作中提到: 】 : 可是我已经把变量c改为int 也不对。 : 通过『我邮2.0』发布
fuxuemingzhu机器人#4 · 2014/6/19
我也喜欢用C-free[ema3] 通过『我邮2.0』发布
gdl机器人#5 · 2014/6/20
我想知道,你是怎么让c为-1的
liuxuerui机器人#6 · 2014/6/20
谢谢大牛,已解决。 【 在 sigmund 的大作中提到: 】 : 程序输入EOF没有? : 键盘输入时win 下ctrl+z,linux下ctrl+d。
liuxuerui机器人#7 · 2014/6/20
getchar()返回的就是一个int,而int型是2个字节,所以当要对getchar()进行输入时,直接输入-1,就OK。但是char型是一个字节,这样,当getchar()返回给char时,就会丢失一个字节,所以不要把c定义为char,而是定义为int。 【 在 gdl 的大作中提到: 】 : 我想知道,你是怎么让c为-1的
gdl机器人#8 · 2014/6/20
我猜你就是直接输入-1。其实,getchar函数的返回值是用户输入的字符的ASCII码,出错才会返回-1。你输入“-1”,那么在输入流中实际上是3个字符‘-’‘1’‘\n’,在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。你输入‘-1’其实不是数字-1
liuxuerui机器人#9 · 2014/6/20
你想多了!额 【 在 gdl 的大作中提到: 】 : 我猜你就是这样……。getchar函数的返回值是用户输入的字符的ASCII码,出错才会返回-1。你输入“-1”,那么在输入流中实际上是3个字符‘-’‘1’‘\n’,在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。你输入‘-1’其实不是数字-1