我的C程序未提供预期输出

时间:2017-11-18 15:31:52

标签: c

我是编程的初学者,我正在学习C语言。我试图从文件中读取内容并对其进行一些处理。

以下是我写过的程序:

#include <stdio.h>

int main()
{
    FILE *fp ;
    int k = 0 ;

    char c ;
    while (c = getc(stdin))
    {
        if (c == 'a')
        { 
            ++k;
        }
    }

    printf ("the value of k is %i" , &k) ;
}

文件输入了:

 > hkjkjaaaaaaaaaak
 > 
 > hjkjlkaaaaaaaaaghgh
 > 
 > hjhkjklklklklklk

但是我没有在控制台中获得任何输出。     我在另一个在线IDE上运行它,我得到一个运行时错误说&#34;超出时间限制&#34;

缺少产出的原因是什么? 是因为我需要以某种方式指定EOF字符,如果程序一直在运行而没有运行?

在从答案中获得帮助后,我用以下代码替换了代码:

#include <stdio.h>

int main()
{
    FILE *fp ;
    int k = 0 ;

    char c ;
    while (c  = getc(stdin) != EOF)
    {
        if (c == 'a')
        { 
            ++k;
        }
   }


   printf ("the value of k is %i" , k) ;
}

这次程序运行了,我得到一个输出说:

the value of k is 0.

从一开始就以某种方式达到EOF吗?为了验证这一点,我尝试将角色与“&#39; h&#39;得到了相同的输出。

是因为getc返回整数而且这与文本中的任何字符都不匹配吗?

非常感谢所有的见解。代码最后工作.Cheers

1 个答案:

答案 0 :(得分:1)

你的编译器应该警告过你:

while (c = getc(stdin) != EOF)
  

警告:将作业结果用作没有括号[-Wparentheses]

的条件

由于!=(不等式)的higher priority超过=(赋值),因此该行被解释为

while (c = (getc(stdin) != EOF))
           ^                  ^

请注意意外的括号,因此c的值只能为零或一,因此c=='a'永远不会为真,因为'a'永远不会等于1.

将其更改为

while ((c = getc(stdin)) != EOF)
       ^               ^

可以给你想要的结果。

您应该考虑删除FILE* fp,因为它根本不做任何事情。它定义了一个指针但以后从未使用过,可能会被编译器优化掉。