在我在Windows上的GCC中,EOF的值是-1。我注意到'ÿ'的值也是-1。所以我做了下面的实验,我对结果完全搞不懂。
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);
}
}结果是
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?
发布于 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
c
char,从而产生-1。这个-1被分配给d.。
发布于 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。这意味着,当成功时,它们总是返回(包括) 0和255之间的值,在到达文件结束时,返回EOF (该值为负值)。
EOF值为负值,不能与'ÿ'混淆。
https://stackoverflow.com/questions/66931625
复制相似问题