【问题标题】:What is the ascii value of EOF in c.?c.中EOF的ascii值是多少?
【发布时间】:2011-10-01 20:16:56
【问题描述】:

任何人都知道 i 的 ASCII 值是什么。

我试试printf("%d",EOF);

但它的打印-1

也可以试试printf("%c",EOF);

但它的打印空白屏幕。

所以任何人都知道EOF 的哪个键。

【问题讨论】:

  • EOF 不是字符!
  • 所有已定义的 ASCII 字符(相当于 Unicode 的“基页”)都指定为 here。有“传输结束”(EOT)等“控制”字符,但没有EOF。
  • 旁注: 如果 EOF 有一个 ASCII 值,那么读取文件内容会非常困难,因为它是文件中的第一次出现 ^^

标签: c++ c


【解决方案1】:

EOF(在 C 语言中定义)不是字符/不是 ASCII 值。这就是getc返回int而不是unsigned char的原因——因为读取的字符可以有unsigned char范围内的任何值,getc的返回值也需要能够表示非字符值 EOF(必然为负)。

【讨论】:

  • 为什么必须是负数?仅仅是标准还是有原因?
  • 这只是C语言的要求。对历史动机的一种猜测是,测试x<0 通常比使用非零常数测试相等性更便宜。通过要求EOF 为负数且所有有意义的字符值均为非负数,程序员可以检查x<0 是否有EOF。
  • “非字符值”是什么意思?如果您的意思是“非字符类型的值”,那么可以,但是'a' 也是非字符值。
  • @M.M:我在纯数字意义上使用了 value 这个词,它没有任何关联的类型。 'a' 是一个值(在任何合理的实现上为 97),它与执行字符集中某个字符的数值相匹配,因此是一个“字符值”。 EOF 必然不同于任何匹配字符的值,因为它是负数,而后者都是非负数。
  • 好的,你只是在getc 的返回值和那里的相关函数的上下文中讨论。确实可能存在与EOF 具有相同值的char
【解决方案2】:

EOF 的实际值是系统定义的,不是标准的一部分。

EOF 是一个带有负值的int,如果你想打印它,你应该使用%d 格式字符串。请注意,这只会告诉您它在您的系统上的价值。你不应该关心它的价值是什么。

【讨论】:

  • 为什么投反对票。我想知道我是否弄错了详细信息。
  • 有些系统int 的宽度与char 相同(DSP,旧的 Cray 超级计算机),但它们很少见。
  • @Dietrich Epp 这些平台上的 C 系统是否符合 C 标准。
  • 当前的 C 标准不要求 EOF 与来自 getc 的可能的非 EOF 返回值不相交,这很奇怪。理论上,在检查 getc 返回 EOF 之后,您还必须检查 feofferror 返回非零。当然,几乎没有人这样做,这很好。 (EOF 只需为负数,这确保它在intchar 更宽的系统上是不相交的。)
  • @Dietrich 感谢您的澄清。据你说,R.. 也弄错了。
【解决方案3】:

没有 EOF 的 ascii 值。有一个包含 127 个字符的 ASCII 标准,EOF 不是其中之一。 EOF 是-1,因为这是他们决定在该特定编译器中 #defined 的内容,它可能是其他任何东西。

【讨论】:

【解决方案4】:

正如赫弗南所说,它是系统定义的。您可以通过 EOF 常量访问它(它是一个常量吗?):

#include <stdio.h>

int main(void)
{
    printf("%d\n", EOF);
}

编译后:

c:\>a.exe
-1
c:\>

【讨论】:

  • 不需要转换为intEOF 被定义为具有 int 类型。
  • 是的,我知道它的返回 -1 但如何停止 While((ch=getche())!=EOF)
  • @Patel getc 返回 int 而不是 charunsigned char。必须先将返回值放入int,否则无法区分EOF
  • @Patel Nik 结束输入。例如如果您通过控制台输入,请在 *nixes 上按 ctrl+d,在 Windows 上按 ctrl+z。另外,使用 stdio.h 中的 getchar(),而不是 conio.h 中的 getche()
【解决方案5】:

EOF 没有他们所说的 ASCII 值....这没问题

您也可以通过设置if 条件来避免最后出现的奇怪字符(这是 EOF 的数字表示),这里是一个示例:

#include <stdio.h>

int main(void)
{
 FILE *file  = fopen("/home/abdulrhman/Documents/bash_history.log", "r");
 FILE *file2 = fopen("/home/abdulrhman/Documents/result.txt", "w");
 file  = 
 file2 = 
 char hold = 'A';

 while(hold != EOF)
  {
    hold = getc(file);
    if(hold == EOF) break; // to prevent EOF from print to the stream
    fputc(hold, file2);
  }

 fclose(file);
 return 0;
}

就是这样

【讨论】:

    【解决方案6】:

    EOF 不是 ASCII 字符。它的大小与字符大小相比不是 1 字节,这可以通过

    来检查
    int main() {
        printf("%lu", sizeof(EOF));
        return 0;
    }
    

    但是,it is always defined to be -1。试试

    int main() {
        printf("%d",EOF);  
        return 0;
    }
    

    EOF 的组合键是 Crtl+D。 EOF 的等效字符取决于机器。可以通过以下方式检查:

    int main() {
        printf("%c", EOF)
        return 0;
    }
    

    【讨论】:

    【解决方案7】:

    出于所有意图和目的 0x04 EOT(传输结束,因为这将正常发出信号并读取函数以在该点停止和切断文件。

    【讨论】:

    • 一些 系统上,键入 Ctrl-D 将发送字符 0x04,这将触发和文件结束条件。但是EOF 的值不是 0x04,即使在这样的系统上也是如此。
    猜你喜欢
    • 2011-02-22
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多