【问题标题】:What does this not work for getchar() method?这对 getchar() 方法不起作用是什么?
【发布时间】:2013-09-04 02:27:16
【问题描述】:

这是我自己的实验,以了解幕后内容,这个程序对编译器意味着什么?

main()
{
  int c;
  printf("%d\n",c);
  printf("%d ", getchar());


  while ((c == getchar()) != EOF){
    putchar(c);
  }
}

当我说 c 必须等于 getchar() (c == getchar()) 时,它不会继续执行 while 循环吗?现在我真的很困惑我自己的代码,c 必须是什么意思!

另外,在这段代码中:

main()
{
int c;
c = getchar()
while ((c = getchar()) != EOF)
putchar(c);
}

如果我们把int c修改成int c = getchar(),为什么不能这么写:

while (c != EOF)(
    putchar(c);
    c = getchar();
    }

编译器应该从前面的语句中知道c = getchar(),为什么还要重新编写语句?对不起,如果我感到困惑。

【问题讨论】:

  • 或许可以试试while ((c = getchar()) != EOF) ?而您的第一个printf()未定义的行为。您正在评估一个当时不确定的变量 (c)。
  • while((c = getchar()) != EOF)
  • @DGomez 我想知道 c==getchar() 是什么意思!我明白了 c = getchar()
  • @WhozCraig 想知道 c==getchar() 是什么意思!我明白了 c = getchar()

标签: c getchar


【解决方案1】:
while ((c==getchar()) != EOF) {
  ...
}

是一个 while 循环。它评估循环的每次迭代的条件,并仅在条件为假时终止。

在你的情况下,条件是:

(c==getchar()) != EOF)

这是一个无意义的表达,但无论如何让我们检查一下:

首先,程序将评估:

    getchar()

这会从标准输入中获取击键。表达式的值就是键的值。

然后:

 c==getchar()

这将获取getchar() 的结果并将其与c 中的当前值进行比较。在您的第一个程序中,c 未初始化,因此它的值是不确定的。如果c 有一个定义的值,那么c==getchar() 将评估为truefalse。由于c 没有定义值,c==getchar() 也没有定义值。

现在程序评估:

(c==getchar())

仍然是 truefalse,除了在你的情况下它是未定义的。

程序接下来考虑:

(c==getchar()) != EOF

也就是说,它将true-false的值与EOF进行比较;这没有什么特别的意义,在你的情况下,我们仍然有未初始化的c 的未定义行为。

总之,如果c 被初始化,表达式将从标准输入中获取一个键,然后将truefalseEOF 进行比较。正如我所说,这是一个无意义的表达。

【讨论】:

  • +1 这段代码已经被编辑了足够多的时间,因为我在另一个答案中的原始 cmets 可能没有什么意义。想象一下两个代码示例的组合。第一个 printf 中的不确定 c,之后是 c = getchar()`,然后是 while((c == getchar()) != EOF)。讨厌发生这种情况。很好的崩溃,先生。 (我可能会产生幻觉。今晚吃了很多止咳糖浆=P)
  • 非常感谢先生的详细解答!不胜感激!
  • 另外,“编译器应该知道...”这个问题——计算机的核心就是这样;他们需要被告知每一件小事。这是诅咒和祝福。可能有理由不先调用 getchar() 就进入该循环。
【解决方案2】:

你是说你想深入了解一下?伟大的!让我们潜入:)

while ((c == getchar()) != EOF)

正如其他人所指出的,这应该是while ((c = getchar()) != EOF)。您进行赋值 (=) 而不是相等性测试 (==) 的原因是因为您实际上是将两行代码合并为一行:c = getchar();while(c != EOF)。因此,如果当前读取的字符是 k,程序会以如下方式评估它:

while ((c = getchar()) != EOF)
while ((c = 'k') != EOF)
while (('k') != EOF)
while ('k' != EOF)
while (1) // true

它还有一个方便的副作用,即c 内部仍然有k,无论您打算做什么。

另一个问题在这里:

int c;
printf("%d\n",c);

printf 会抱怨,因为你还没有给c 分配任何东西。它已“声明”,但未“初始化”。它不能打印不存在的东西 - 如果可以,它肯定会打印你不想要的东西。

【讨论】:

  • 感谢您的回答,非常好,非常感谢先生!
【解决方案3】:

你有一个额外的等号需要删除:

while ((c == getchar()) != EOF){

应该是

while ((c = getchar()) != EOF){

这就是正在发生的事情。当(c == getchar()) 被执行时,以c 开头的是未初始化的,所以它有一些垃圾值。将该垃圾值与输入流中的下一个字符进行比较,以查看它们是否相同。比较的结果将是0(如果它们不同)或1(如果它们相同)。后者不太可能发生,但理论上有可能通过某种幸运(?)机会,垃圾值确实与输入流中的下一个字符匹配。

然后比较 01 以查看它是否匹配 EOF。好吧,EOF 将是一些负值;这就是它的定义。显然01 永远不会匹配任何负值,因此您的循环将是无限的。

至于你的第二个代码片段:

c = getchar();
while ((c = getchar()) != EOF) {

您没有检查第一个字符是否为EOF,因为在第一个getchar() 之后的c 的值将立即被while 条件中的赋值替换。假设有一个非EOF 第一个字符,您的代码将起作用。

至于你的第三个代码片段:

c = getchar();
while (c != EOF) {     // corrected your typo of ( instead of {
    putchar(c);
    c = getchar();
}

您必须在while 循环中再次写入c = getchar() 的原因是用输入流中的第二个和后续字符更新c 的值。否则,它将始终将输入流中的第一个字符c 的当前值与EOF 进行比较,这也将是一个无限循环,除非第一个字符恰好是EOF

实现你想要的最简洁的方法是:

int c; 而 ((c = getchar()) != EOF) putchar (c);

...就像您的第二个代码片段一样,减去执行第一个 getchar() 并将其分配给 c 的额外行。

【讨论】:

  • 我明白了,我只是想知道 c == getchar() 是什么意思。
  • @user2282137 想想这意味着什么。这意味着您将之前输入的 first 字符与您之后输入的任何字符进行比较,并将布尔结果(0 或 1)与 EOF(通常定义为 (-1 ). 因为0 永远不会是-1,而1 永远不会是-1,因此是一个无限循环。
  • @WhozCraig 例如,当我运行程序并说输入:a(c 的值是?) b(c 的值是?)c == getchar 什么时候?对不起,我是新人。
  • @user2282137 当您在上面的行中分配c 时,它是什么?假设它是'a'。你认为c == getchar() 什么时候会是true在其他情况下会是什么?
  • 我这样修改了我的代码以真正理解发生了什么:while ((c == getchar()) != EOF){ printf("%d\n", (c == getchar ())); putchar(c); }
【解决方案4】:

c == getchar() != EOF 表示

如果cresult returned from getchar() 相同,则c == getchar() 为真。

c == getchar() 将始终不等于 EOF(因为两者都不等于 EOF)所以程序应该无限循环打印随机出现的字符,因为你从未初始化 c int c;

【讨论】:

  • 非常感谢您的回答,非常棒,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 2015-10-05
相关资源
最近更新 更多