首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于EOF和EOF的混淆

关于EOF和EOF的混淆
EN

Stack Overflow用户
提问于 2021-04-03 13:21:17
回答 2查看 158关注 0票数 0

在我在Windows上的GCC中,EOF的值是-1。我注意到'ÿ'的值也是-1。所以我做了下面的实验,我对结果完全搞不懂。

代码语言:javascript
复制
int main() {
    
    int a = 'ÿ';
    if (a == EOF) {
        putchar('a');
        putchar(a);
    }

    char b = 'ÿ';
    if (b == EOF) {
        putchar('b');
        putchar(b);
    }

    putchar('\n');

    int c;
    if ((c = getchar()) != EOF) {
        putchar('c');
        putchar(c);
    }

    char d;
    if ((d = getchar()) != EOF) {
        putchar('d');
        putchar(d);
    }
}

结果是

代码语言:javascript
复制
aÿbÿ  // a == EOF b == EOF
ÿÿ    //My input for int c and char d
cÿ    // c != EOF

我的问题是:1.当我将'ÿ'直接赋值给变量时,不管类型是int还是char,它都等于EOF。但是,当我从stdin中将'ÿ'分配给int c时,结果发现c并不等于EOF。这里发生了什么?2.,如果文件中有'ÿ',系统如何区分'ÿ'EOF

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-03 13:52:04

C程序有一个执行字符集,这决定了字符文本如何映射到整数值。

您的程序似乎是用iso-8859-1作为执行字符集进行编译的。在我的电脑上,gcc的默认值是utf-8,其中'ÿ'映射到“多字符常量”50111。gcc用iso-8859-1将其映射为-1。我必须使用标志-fexec-charset=iso-8859-1复制你看到的东西。

当您从文件(或stdin)读取时,您将得到操作系统给您的任何字节(解释为一个无符号字符)。stdin和文件的编码通常独立于执行字符集。

您所观察到的是,执行字符集是iso-8859-1映射到范围-128到127 (而不是通常的0到255),大概是基于在编译器上签名char的基本原理,因此可以表示执行字符集中的每个值。stdin的编码似乎也是iso-8859-1,但它使用的是通常的0到255。如果(d)在你的问题中,值255被分配给一个char (它可能是签名的,从-128到127),而gcc正在包装它。

摘要:

(A)分配-1到a

  • (b)分配-1到b

  • (c)分配255到c

  • (d) -将255转换为char,从而产生-1。这个-1被分配给d.

票数 1
EN

Stack Overflow用户

发布于 2021-04-03 13:30:40

'ÿ'是数字255的字符表示形式。它作为char文字的值是-1

255-1都有相同的8位表示形式(11111111),这取决于它是被解释为有符号值还是无符号值。char被签名,因此它作为char的值是-1

当它被分配给一个char变量时,它将按原样存储。

当它被分配给一个int变量时,这个值被提升到int,并且这不会改变它的值,它只能使用更多的位(4个字节)来表示。

顺便说一句,-1也是EOF的值(但是您应该始终在代码中使用常量EOF,永远不要依赖它的数值)。

getchar()返回一个int;对于'ÿ',它返回255。

当将其赋值给一个int时,该值将被保留。

当将其赋值给char时,行为是未定义的(因为char变量的可能值范围是-128..+127)。

您的编译器似乎选择将最右边的8位255存储到char变量中,并且由于char被签名,该值被解释为-1

如果文件中有‘

’,那么系统如何区分‘the’和EOF?

getchar()fgetc()/getc()和其他读取字符的函数返回int。这意味着,当成功时,它们总是返回(包括) 0255之间的值,在到达文件结束时,返回EOF (该值为负值)。

EOF值为负值,不能与'ÿ'混淆。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66931625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档