1

所以...我正在尝试制作自己的简单键盘记录器,这适用于在 shell 中键入的内容,但是如果我双击可执行文件,它只会将其中的很多内容放入文件中:ÿ

我知道到目前为止,如果我输入 aj它将结束;这是为了调试:


#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;
}
4

2 回答 2

3

可能是因为双击时没有输入流,或者它立即为空。在那些条件下,fgetcEOF不断返回。我不能肯定地说,但它解释了你看到的症状。

您需要进行比较inputEOF查看是否找到了流的结尾,因为在这种情况下,您将永远没有机会输入j. 尝试改变:

if (input==*"j")

至:

if ((input == 'j') || (input == EOF))

(您会注意到我也将相当...不寻常*"j"的 xonstruct 更改为更简单'j'的)。

from 的返回值fgetc也应该是 an,int因为它必须代表每个可能的字符plus EOF

于 2011-06-11T01:13:06.047 回答
1
char input=fgetc(stdin);

请注意,它的返回值fgetc()需要一个int(嗯,比char--更大的东西int):EOF除了char可能采用的任何值之外,它是一个可能的返回值。

if (input==*"j")

哎呀,这很尴尬。:) 字符比较(如果在这种情况下可以的话)看起来像:

if (input == 'j')

''了解字符和字符串之间的区别""对于成为一名优秀的程序员至关重要。'string' "string"在其他脚本语言的自由形式和各种行为之后,它可能会感到生硬"""string""",但它就是这样。

通常,这些类型的程序是用不同的布局编写的:

int c;
while((c = getchar()) != EOF) {
    /* do something with c */
}

将作业测试置于 a 的条件下,一while开始可能会觉得很奇怪,但这是惯用的。(而且我非常怀念禁止这种行为的语言。)

于 2011-06-11T01:16:56.703 回答