while((ch = getchar()) != EOF)...看个死循环

白菜-C 2013-06-17 02:39:40
char ch;
...

while((ch = getchar()) != EOF)...

(1)为什么getchar返回的是个整型值而不是字符值;

(2)此循环要遇到啥才能结束(有符号字符集的机器上运行),为什么;

(3)能给我详细讲解下EOF吗?它的值一般是-1,这里的这个-1是什么内型的?
...全文
413 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2013-06-17
  • 打赏
  • 举报
回复
char ch; ... while((ch = getchar()) != EOF)... (1)为什么getchar返回的是个整型值而不是字符值; 因为getchar能返回char范围之外的东西,比如EOF (2)此循环要遇到啥才能结束(有符号字符集的机器上运行),为什么; Linux输入Ctrl + D Windows输入Ctrl + Z回车 (3)能给我详细讲解下EOF吗?它的值一般是-1,这里的这个-1是什么内型的? EOF就是int类型的,所以ch要定义成int而不是char
xky96 2013-06-17
  • 打赏
  • 举报
回复
\377=255=0x000000FF getchar()是整型函数, 所以返回4字节整数0x000000FF ch=getchar(),保存到ch需要截取单字节=0xFF 因为ch是有符号char型,0xff转为(char)-1 if(ch==EOF),ch与-1(int型)比较,ch需要转换为int型,即(char)-1转为(int)-1,相当于0xFFFFFFFF 目前C编译器默认char为有符号,如果是无符号,ch就等于255,而不是-1 255等于-1?
白菜-C 2013-06-17
  • 打赏
  • 举报
回复
不过这里面的好多东西我都没能明白,想请高手们详细解释下,在此谢过
白菜-C 2013-06-17
  • 打赏
  • 举报
回复
额,在C和指针里面解释说:(原文)EOF需要的位数比字符型提供的位数要多,这也是getchar返回一个整型值而不是字符值得原因。然而,把getchar的返回值首先存储于ch中将导致被截短,,然后这个被截短的值被提升为整型并与EOF进行比较。当这段错误的代码在使用有符号字符集的机器上运行时,如果读取了一个值为/377的字节时,循环将会终止,因为这个值截短再提升之后与EOF相等。当这段代码在使用无符号字符集的机器上运行是,这个循环永远不会终止。
www_adintr_com 2013-06-17
  • 打赏
  • 举报
回复
引用 10 楼 xky96 的回复:
[quote=引用 9 楼 adlay 的回复:] 1. 谁说中文不能用 getchar 了? fgetwchar 是用于 UNICODE 的, 中文并不都是 UNICODE, 还有 gb2312 编码的中文, 而且你的控制台默认就是 gb2312 编码的! 2. 还是不明白你想说啥子. char ch=-1; if(ch==-1) // 条件为真 int ch=-1; if(ch==-1) // 条件也为真 回答了我的什么问题?
行了,不跟你瞎扯, 都跑题到哪里了[/quote] 还不是你开始的.
xky96 2013-06-17
  • 打赏
  • 举报
回复
引用 9 楼 adlay 的回复:
1. 谁说中文不能用 getchar 了? fgetwchar 是用于 UNICODE 的, 中文并不都是 UNICODE, 还有 gb2312 编码的中文, 而且你的控制台默认就是 gb2312 编码的! 2. 还是不明白你想说啥子. char ch=-1; if(ch==-1) // 条件为真 int ch=-1; if(ch==-1) // 条件也为真 回答了我的什么问题?
行了,不跟你瞎扯, 都跑题到哪里了
www_adintr_com 2013-06-17
  • 打赏
  • 举报
回复
1. 谁说中文不能用 getchar 了? fgetwchar 是用于 UNICODE 的, 中文并不都是 UNICODE, 还有 gb2312 编码的中文, 而且你的控制台默认就是 gb2312 编码的! 2. 还是不明白你想说啥子. char ch=-1; if(ch==-1) // 条件为真 int ch=-1; if(ch==-1) // 条件也为真 回答了我的什么问题?
xky96 2013-06-17
  • 打赏
  • 举报
回复
引用 6 楼 adlay 的回复:
[quote=引用 5 楼 xky96 的回复:] [quote=引用 4 楼 adlay 的回复:] 如果 getchar 返回的是 char, 那么它如何区别字符的 0xFF 和文件结束呢? 0xFF 在 char 里就是 -1. 而 int 的 -1 是 0xFFFFFFFF, 普通的字符永远不可能是这个值.
1、控制台输入大于127(用 alt+小键盘 输入),getchar只取二进制低7位,最高位=0 2、做下试验:
ch=-1;
if(ch==-1)
[/quote] 1. 什么意思? 你说 getchar 返回的值不会是负数? 你输入中文看看. 2. 更不知道你想说什么了.[/quote] 1、中文就不应该用getchar, 要用fgetwchar,对应的结束符WEOF 单字节字符高位会被截,但好像没规律(alt-145 之类的双字节输入不算)。 2、只是回答你的(char)-1 与 (int)-1的问题了,别把他们转成二进制比较
vuqrzk5w 2013-06-17
  • 打赏
  • 举报
回复
constant <cstdio>
EOF
End-of-File
It is a macro definition of type int that expands into a negative integral constant expression (generally, -1).

It is used as the value returned by several functions in header <cstdio> to indicate that the End-of-File has been reached or to signal some other failure conditions.

It is also used as the value to represent an invalid character.

In C++, this macro corresponds to the value of char_traits<char>::eof().
www_adintr_com 2013-06-17
  • 打赏
  • 举报
回复
引用 5 楼 xky96 的回复:
[quote=引用 4 楼 adlay 的回复:] 如果 getchar 返回的是 char, 那么它如何区别字符的 0xFF 和文件结束呢? 0xFF 在 char 里就是 -1. 而 int 的 -1 是 0xFFFFFFFF, 普通的字符永远不可能是这个值.
1、控制台输入大于127(用 alt+小键盘 输入),getchar只取二进制低7位,最高位=0 2、做下试验:
ch=-1;
if(ch==-1)
[/quote] 1. 什么意思? 你说 getchar 返回的值不会是负数? 你输入中文看看. 2. 更不知道你想说什么了.
xky96 2013-06-17
  • 打赏
  • 举报
回复
引用 4 楼 adlay 的回复:
如果 getchar 返回的是 char, 那么它如何区别字符的 0xFF 和文件结束呢? 0xFF 在 char 里就是 -1. 而 int 的 -1 是 0xFFFFFFFF, 普通的字符永远不可能是这个值.
1、控制台输入大于127(用 alt+小键盘 输入),getchar只取二进制低7位,最高位=0 2、做下试验:
ch=-1;
if(ch==-1)
www_adintr_com 2013-06-17
  • 打赏
  • 举报
回复
如果 getchar 返回的是 char, 那么它如何区别字符的 0xFF 和文件结束呢? 0xFF 在 char 里就是 -1. 而 int 的 -1 是 0xFFFFFFFF, 普通的字符永远不可能是这个值.
图灵狗 2013-06-17
  • 打赏
  • 举报
回复
1、字符本来是char类型就够了,但是为了区别文件结束符,需要扩展到int类型; 2、EOF通常是定义为-1,但是也不绝对,取决于系统的设计; 3、Windows下Ctrl-Z表示EOF,Linux下Ctrl-D表示EOF。
引用 楼主 u010765465 的回复:
char ch; ... while((ch = getchar()) != EOF)... (1)为什么getchar返回的是个整型值而不是字符值; (2)此循环要遇到啥才能结束(有符号字符集的机器上运行),为什么; (3)能给我详细讲解下EOF吗?它的值一般是-1,这里的这个-1是什么内型的?
luoyz520 2013-06-17
  • 打赏
  • 举报
回复
1 函数原型 int getchar(void);返回的是int 2 VS或者VC++可以输入CTRL + Z结束此循环 3 EOF是个宏,VS下你可以按F12定位过去看看
xky96 2013-06-17
  • 打赏
  • 举报
回复
char是字符型, 也可以当它是单字节整型 EOF:end of file,是个宏定义,=-1,当然是整型常量 读取字符到文件结尾初,循环结束

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧