为什么getchar()不能正常工作?

为什么getchar()不能正常工作?,c,cygwin,C,Cygwin,今天,我编写了一段简单的代码,它使用getchar()来计算输入的字符数。但当我在Cygwin上编译它时,它不起作用。它总是打印0,但我从未输入任何内容,或者我无法输入它打印0的任何字符 但是,如果我用VC++6.0编译它,它就可以工作了 #include<stdio.h> int main(void) { long nc; nc = 0; while(getchar() != EOF) ++nc; printf("The total of characters y

今天,我编写了一段简单的代码,它使用
getchar()
来计算输入的字符数。但当我在Cygwin上编译它时,它不起作用。它总是打印0,但我从未输入任何内容,或者我无法输入它打印0的任何字符

但是,如果我用VC++6.0编译它,它就可以工作了

#include<stdio.h>
int main(void)
{
 long nc;

 nc = 0;
 while(getchar() != EOF)
    ++nc;
 printf("The total of characters you inputed is %ld.\n", nc);
 return 0;
}
#包括
内部主(空)
{
长nc;
nc=0;
while(getchar()!=EOF)
++数控;
printf(“您输入的字符总数为%ld。\n”,nc);
返回0;
}
谈到了一个听起来很像你的bug,但我看不出有任何后续问题

我很想知道你尝试的时候发生了什么

while(getc(stdin)!=EOF)

如果这不起作用,试试看
while(fgetc(stdin)!=EOF)

所有这些功能都应该可以工作,尽管page建议这些功能之间可能存在实现差异

您可以尝试的另一件事是打印您得到的ASCII值:

printf(“%d\n”,(int)getchar())

另外,尝试从文件中输出管道,而不是在控制台中键入。创建一个文件
input.txt
,在其中输入一些字符,然后执行以下操作

cat input.txt |/程序


编辑:您可以编写运行的cat并使其运行。我会说只需更新你的Cygwin版本。您遇到了一个bug。获得最新版本的Cygwin和编译器,您应该可以开始了。另一个选项是使用。

在cygwin上编译时使用的是什么?我有cygwin并使用VC进行编译,这很好。您的确切代码在cygwin(使用GCC编译)中非常适合我。你必须点击control-D才能发送EOF。你到底是如何运行这个程序的?当您从Cygwin bash shell提示符运行
echo hello |/您的_程序
时会发生什么?如果只键入
/u程序
,然后键入
hello
,然后输入,然后输入Control-D,会怎么样?@Zsm0107:如果运行
/nc hello
,它会将
“hello”
作为参数传递给命令,而不是作为输入。键入
/nc
,然后输入,然后输入
hello
,然后输入,然后输入Control-D。(在任何情况下,我们都知道您的程序能够从其标准输入中读取和计数字符;问题出在您的环境中,而不是在您的C代码中。)@Zsm0107:
wc
从键盘读取时工作正常,从管道读取数据时,程序工作正常(
echo hello |./nc
),但
/nc
本身会立即终止。我的点子快用完了。您是否100%确定您发布的代码正是您正在运行的程序?如果修改程序(让它打印
“hello”
),重新编译并运行它,它是否打印新消息并打印0?关键是,您可能不知何故没有运行您认为正在运行的代码;我自己也犯过这样的错误。而(getc(stdin)!=EOF)和wihle(fgetc(stdin)!=EOF)也不起作用。和printf(“%d\n”((int)getchar());“prints'-1”。但我对cat input.txt |/a很感兴趣。它运行得很好。但我不理解它,为什么它可以运行良好。请更新您的工具。:)另外,尝试使用cmd.exe而不是Cygwin shell运行程序。这行得通吗?我的Cygwin是,所以我认为它是最新版本,但我使用cmd.exe来运行它。它工作正常。@Chritian Jonassen:“Cygwin DLL的最新版本是1.7.9-1。通过运行setup.exe来安装它。”这一个。很抱歉,我没有发布清楚。当我用gcc版本4.5.3(gcc)编译它并在Cygwin终端mintty 1.0.3中运行它时,程序正常工作。