首页 文章

C EOF符号值和签名字符

提问于
浏览
1

今天我只是躺在床上冥想编程的东西,当一个想法流入我的脑海时,我无法用自己的能力解决 . 这就是问题 .

我读了一本书,解释了为什么EOF值为-1,解释如下:

为什么-1?通常getchar()返回0到127范围内的值,因为它们是与标准字符集对应的值,但如果系统识别扩展字符集,它可能会返回0到255之间的值 . 在任何一种情况下,值-1都不对应任何字符,因此它可用于表示文件的结尾 .

1.)上面的陈述很奇怪,因为我记得除了有符号整数之外,有符号字符也是C中存在的一种变量,所以这意味着可以使用从-128到127的值 . 但为什么这本书仍然提到 - 1与键盘输入的任何字符使用都不矛盾?

6 回答

  • 3

    标准不是't say it' s -1 .

    EOF扩展为整数常量表达式,类型为int和负值,由多个函数返回以指示文件结束,即不再有来自流的输入

    's not a value that you can read from a file. It'是一个"out of band"的值 getc ,除了"end of file"之外的任何情况都不能返回 .

  • 3

    getchar实际上返回一个 int ,这意味着它有超过8位 . 如果 getchar 返回0到255(含)之间的数字,那么您知道它从您正在读取的文件中返回了一个有效字节 . 如果它返回-1,则表示您已到达文件的末尾 . 因为该值是 int ,所以保证-1不等于0到255之间的任何值 .

  • 0

    你得到的答案都没有提到(至少IMO)至关重要的一点 .

    当您读取一个字符时,该值将被读取为 unsigned char ,并从那里转换为 int (§7.19.7.1/ 2):

    如果未设置stream指向的输入流的文件结束指示符并且存在下一个字符,则fgetc函数将该字符作为转换为int的unsigned char获取并提前关联的文件位置指示符流(如果已定义) .

    此特定报价适用于 fgetc - getcgetcharfread 都需要读取数据,就像调用 fgetc 一样 .

    这隐含地(至少有点)假设 char 的范围小于 int ,因此转换为 int 允许至少表示一个值,而且't have come from the file. Elsewhere, the standard denies that as a requirement, but I think that denial is unrealistic -- I'm非常确定 charint 相同大小的实现会破坏巨大的代码量 .

  • 0

    这就是getchar()返回int的原因 . 如果它返回了signed char,你将无法区分EOF和-1字符(128来自扩展集),如果它返回unsigned char则-1将没有任何意义 . 但是getchar()返回int,如果它在0到255的范围内,则它是一个字符但是如果它返回-1那么它的EOF

  • 3

    getchar() 返回一个int,其中包含普通(无符号)char或EOF,因此没有问题 .

  • 0

    getchar()返回一个int . -1表示EOF,或0到255. int类型足够大,不会与那些冲突 .

相关问题