【问题标题】:What will be output of this code ?How EOF terminate in terminal? [duplicate]此代码将输出什么?EOF 如何在终端中终止? [复制]
【发布时间】:2019-06-11 07:50:22
【问题描述】:

我无法在此 c 代码中打印计数 c。

我已经在一个有很多行的终端中尝试过。

#include<stdio.h>
main()
{

    long c=0;
    while(getchar()!=EOF)
        ++c;
    printf("%ld\n",c);
}

预期结果应该是我们提供的字符。

【问题讨论】:

  • 你的编译器没有发出关于使用long c uninitialized 的警告吗?
  • 本地(自动)变量未初始化。它们的值是不确定的。任何血统教科书或教程或老师都应该教过你。
  • main() 应该是 int main(void)。为了将来参考,请在您的问题中说明您得到了什么输出。我希望您的程序会打印一些任意整数值。 (它对我“有效”,显然是因为 c 的初始值恰好为零。)
  • 我的程序没有给我编译错误。只是在终端中没有完成。我想了解 EOF 。
  • 我怀疑,一旦您解决了 cmets 中指出的问题,您的问题将通过以下方式回答:stackoverflow.com/questions/1118957/c-how-to-simulate-an-eof

标签: c


【解决方案1】:

你的程序暴露了未定义的行为,因为c 没有被初始化。 实际上,预测c 结果的每个答案都是错误的,即使有人说“这是垃圾”。您的变量c 是一个具有自动存储持续时间的局部变量,因此它本身不会被初始化;在表达式++c 中,您的变量是一个左值,因为它指定了一个对象。查看标准对左值和非初始化的说明(例如,参见 this 在线 C11 标准草案):

6.3.2.1 左值、数组和函数指示符

1...

2...如果左值指定了一个可以使用寄存器存储类声明的自动存储持续时间的对象(从不 已获取其地址),并且该对象未初始化(未声明 使用初始化程序并且之前没有对其进行分配 使用),行为未定义

【讨论】:

    【解决方案2】:

    要在终端中发送EOF 信号,您需要键入一个特殊键,具体取决于您使用的操作系统。例子:

    • 在 Windows (cmd) 上是 CtrlZ
    • 在 Linux 上是 CtrlD

    您需要在行首输入。

    【讨论】:

      猜你喜欢
      • 2015-02-19
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 2022-07-18
      • 2019-08-06
      • 2011-05-23
      相关资源
      最近更新 更多