C 为什么这两种方法返回不同的东西?
所以…我试着制作我自己的简单键盘记录器,它适用于在shell中键入的东西,但是如果我双击可执行文件,它会在文件中放入很多这样的东西:C 为什么这两种方法返回不同的东西?,c,stdin,printf,fgetc,C,Stdin,Printf,Fgetc,所以…我试着制作我自己的简单键盘记录器,它适用于在shell中键入的东西,但是如果我双击可执行文件,它会在文件中放入很多这样的东西:ÿ 我明白,从现在起,如果我输入aj,它将结束;这是用于调试的: #包括 #包括 #包括 内部主(空) { 文件*fp=fopen(“log”,“w”); 如果(fp!=NULL) { int x=0; 而(x==0) { 字符输入=fgetc(标准输入); 如果(输入=*“j”) x=1; 其他的 { fprintf(fp,“%c\n”,输入); } } fc
ÿ
我明白,从现在起,如果我输入aj,它将结束;这是用于调试的:
#包括
#包括
#包括
内部主(空)
{
文件*fp=fopen(“log”,“w”);
如果(fp!=NULL)
{
int x=0;
而(x==0)
{
字符输入=fgetc(标准输入);
如果(输入=*“j”)
x=1;
其他的
{
fprintf(fp,“%c\n”,输入);
}
}
fclose(fp);
}
返回0;
}
可能是因为双击时没有输入流,或者直接是空的。在这些条件下,fgetc
将连续返回EOF
。我不能肯定这一点,但它解释了你看到的症状
您需要将input
与EOF
进行比较,以查看是否找到了流的结尾,因为在这种情况下,您将永远没有机会输入j
。尝试更改:
if (input==*"j")
致:
(您会注意到,我已经将非常不寻常的*“j”
xonstruct更改为更简单的'j'
)
fgetc
的返回值也应该是int
,因为它必须表示每一个可能的字符加上EOF
,这可能是因为双击时没有输入流,或者直接为空。在这些条件下,fgetc
将连续返回EOF
。我不能肯定这一点,但它解释了你看到的症状
您需要将input
与EOF
进行比较,以查看是否找到了流的结尾,因为在这种情况下,您将永远没有机会输入j
。尝试更改:
if (input==*"j")
致:
(您会注意到,我已经将非常不寻常的*“j”
xonstruct更改为更简单的'j'
)
fgetc
的返回值也应该是int
,因为它必须表示每个可能的字符加上EOF
请注意,fgetc()
需要一个int
(好吧,通常大于char
--int
的值)作为其返回值:EOF
是除char
可能采用的任何值之外的一个可能的返回值
哎呀,这太尴尬了。:)角色比较(如果在本例中可以的话)如下所示:
if (input == 'j')
了解'
字符和'
字符串之间的区别对于成为一名优秀的程序员至关重要。在自由形式的'string'
“string”
和“string”
其他脚本语言的各种行为之后,它可能会感觉很僵硬,但事实就是这样
通常,这些类型的程序使用不同的布局编写:
int c;
while((c = getchar()) != EOF) {
/* do something with c */
}
将作业和测试放在的条件下,
一开始可能会觉得奇怪,但这是惯用的。(在禁止这种行为的语言中,我非常怀念这种行为。)
请注意,fgetc()
需要一个int
(好吧,通常大于char
--int
的值)作为其返回值:EOF
是除char
可能采用的任何值之外的一个可能的返回值
哎呀,这太尴尬了。:)角色比较(如果在本例中可以的话)如下所示:
if (input == 'j')
了解'
字符和'
字符串之间的区别对于成为一名优秀的程序员至关重要。在自由形式的'string'
“string”
和“string”
其他脚本语言的各种行为之后,它可能会感觉很僵硬,但事实就是这样
通常,这些类型的程序使用不同的布局编写:
int c;
while((c = getchar()) != EOF) {
/* do something with c */
}
将作业和测试放在
的条件下,
一开始可能会觉得奇怪,但这是惯用的。(我非常怀念禁止这种行为的语言。)事实上,*“j”之所以有效,是因为“j”是一个字符串(第一个字符的位置),而且由于*“j”的计算结果是该位置的值,因此它将是字符j@Jack,*“杰霍瓦的证人”
也可以,但同样奇怪。任何一个好的编译器都可能会将其优化到同样的程度,但它不会阻止继承您代码的程序员质疑您的理智:-)实际上…*“j”起作用,因为“j”是一个字符串(第一个字符的位置),并且由于*“j”的计算结果是该位置的值,因此它将是字符j@Jack,*“杰霍瓦的证人“
也可以,但同样奇怪。任何一个好的编译器都可能会将其优化到同样的程度,但这不会阻止继承您代码的程序员质疑您的理智:-)所以……这确实解决了问题,但我的问题是,为什么输入流是空的或不存在的?为什么它不断返回EOF?所以…这确实解决了它,但我的问题是,为什么输入流是空的或不存在的?为什么它不断返回EOF?
int c;
while((c = getchar()) != EOF) {
/* do something with c */
}