所以...我试图制作我自己的简单键盘记录器,这适用于在shell上键入的内容,但如果我双击可执行文件,它只会在文件中放入很多:ÿ
据我所知,如果我输入 j ,它将会结束;这是为了调试:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main(void)
{
FILE *fp = fopen("log", "w");
if (fp != NULL)
{
int x=0;
while (x==0)
{
char input=fgetc(stdin);
if (input==*"j")
x=1;
else
{
fprintf(fp, "%c\n",input);
}
}
fclose(fp);
}
return 0;
}
答案 0 :(得分:3)
可能是因为双击时没有输入流,或者它是空的。在这些情况下,fgetc
会不断返回EOF
。我不能肯定地说,但它解释了你所看到的症状。
您需要将input
与EOF
进行比较,看看是否找到了流的结尾,因为在这种情况下,您永远不会有机会输入j
。尝试更改:
if (input==*"j")
为:
if ((input == 'j') || (input == EOF))
(你会注意到我已经将相当......不寻常的*"j"
xonstruct更改为更简单的'j'
。
fgetc
的返回值也应为int
,因为它必须代表每个可能的字符 plus EOF
。
答案 1 :(得分:1)
char input=fgetc(stdin);
请注意,fgetc()
要求int
(以及大于char
- int
惯例)的返回值为EOF
char
是if (input==*"j")
可能采用的任何值之外的可能返回值。
if (input == 'j')
哎呀,这是尴尬。 :)字符比较(如果在这种情况下还可以)看起来像:
''
了解""
字符与'string'
字符串之间的区别对于成为优秀的c程序员至关重要。在其他脚本语言的自由格式"string"
"""string"""
和int c;
while((c = getchar()) != EOF) {
/* do something with c */
}
种行为之后,它可能会感到沮丧,但它的方式却是如此。
通常,这些类型的程序使用不同的布局编写:
while
在{{1}}的条件下进行作业和测试一开始可能会感觉很奇怪,但这是惯用的。 (并且我在禁止它的语言中严重错过了这种行为。)