getchar()没有通过EOF,Ctrl + Z也没有终止Cygwin上的程序

时间:2014-10-04 11:45:28

标签: c eof getchar

这是一个简单的程序,计算字符串,符号和单词。

使用Cygwin进行计算时一切正常。

但是在启动时,在输入值之后,程序不会打印ncnwnl并等待输入更多值。

EOF更改为13(回车)无论如何都无济于事。

ctrl + Z 也很有用:程序正在停止,写[n]+ Stopped,其中' n'总是不同的数字。

代码是

#include <stdio.h>
#define IN 1
#define OUT 0


int main () {

    char c;
    int state;
    int nc, nw, nl;
    state = OUT;    

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

        if (c == 'n') 
            nw++;


        if (c == '\n' || c == ' ' || c == '\t') 
            state = OUT;
        else if (state = OUT){
            state = IN;
            nw++;
        }

    }
    printf ("%d %d %d", nc, nl, nw);
}

5 个答案:

答案 0 :(得分:4)

getchar返回int,而不是char。它必须这样做,因为它可以返回一个字符值或返回特殊值EOF来指示输入文件的结束。由于EOF必须与char类型的所有值不同,因此它不具有char类型。因此,您需要将包含其返回值的变量定义为int,而不是char

在某些平台上,char类型已签名,getchar函数实际上并不返回字符值,而是将字符值包装为非负值。实际上,这意味着ASCII字符不变,但在某些平台上,非ASCII字符转换为128到255之间的值,而不是-128和-1之间的值。因此,当您将其用作字符时,通常需要将getchar的返回值强制转换为char。在char类型未签名的平台上,这不会改变任何内容,但在char类型已签名的平台上,必须避免将字符255误认为文件的末尾。

int c;
…
while ((c = getchar()) != EOF) {
    …
    if (c == 'n') /* ok because 'n' is part of ASCII and thus always positive */
        …
    if ((char)c == some_other_char) /*cast needed in general*/
        …
}

在Cygwin中,与其他类Unix系统一样,在行的开头按 Ctrl + D 表示输入结束。在Windows下,您需要按 Ctrl + Z (在Cygwin下,再次像其他类Unix系统一样,它会暂停程序:它已停止,但可以恢复使用命令bg)。这些都没有向程序发送控制字符,它们发送文件结束指示,其中C getchar实现转换为EOF值。

答案 1 :(得分:1)

初始化您用来计算的变量:

  int nc = 0, nw = 0, nl = 0;

当你不这样做时,他们会得到随机值。

另外,你计算单词的逻辑是错误的。

else if (state = OUT)你可能意味着else if (state == OUT)

答案 2 :(得分:1)

#include <stdio.h>   
#define IN 1  
#define OUT 0
int main()
{
   int c, nl, nw, nc, state; //c is an int not a char        
   state = OUT;
   nl = nw = nc = 0;   // initialize variables to 0
   while ((c = getchar()) != EOF) {
       ++nc;
       if (c == '\n') // if c is a newline character 
           ++nl;     //increment no of lines
       if (c == ' ' || c == '\n' || c == '\t')
           state = OUT;
       else if (state == OUT) // == for comparing
       {
           state = IN;
           ++nw;
       }
    }
   printf("%d %d %d\n", nl, nw, nc);
return 0;
}

你的程序看起来应该像上面那样。 cint而不是char,因为getchar会将输入转换为unsigned char,因为它不能保留负值,因为EOF成立-1,while循环永远不会结束。

当你按下CTRL + Z(在Windows中按CTRL + D)时结束,因为按下它将模拟EOF中的stdin

答案 3 :(得分:0)

你这里有很多错误。

int nc, nw, nl;

应该是

int nc = 0, nw = 0, nl = 0;


else if (state = OUT){

我认为你的意思是

else if (state == OUT) {

ENTER是10而不是13。

cygwin上的

getchar()在文件末尾返回-1(我不知道为什么)。所以你可以用-1代替EOF。 您可以这样测试您的程序:./ program.exe&lt;查找inputfilename

答案 4 :(得分:0)

还有这个问题吗?可能已找到解决方案: 如果你键入一些字符然后按ctrl-z,那么ctrl-z算作普通字符(代码26),但是在一行的开头(意思是:除了ctrl-z字符之外你不要键入任何内容) )它算作EOF。这样:

while ( (ch=getchar())!=26 ){
    if (ch==EOF) break;
}

这样在你输入ctrl-z char的地方并不重要,迭代结束。