为什么这两种方法会返回不同的东西?

时间:2011-06-11 01:04:26

标签: c stdin printf fgetc

所以...我试图制作我自己的简单键盘记录器,这适用于在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;
}

2 个答案:

答案 0 :(得分:3)

可能是因为双击时没有输入流,或者它是空的。在这些情况下,fgetc会不断返回EOF。我不能肯定地说,但它解释了你所看到的症状。

您需要将inputEOF进行比较,看看是否找到了流的结尾,因为在这种情况下,您永远不会有机会输入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 charif (input==*"j") 可能采用的任何值之外的可能返回值。

if (input == 'j')

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

''

了解""字符与'string'字符串之间的区别对于成为优秀的程序员至关重要。在其他脚本语言的自由格式"string" """string"""int c; while((c = getchar()) != EOF) { /* do something with c */ } 种行为之后,它可能会感到沮丧,但它的方式却是如此。

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

while

在{{1}}的条件下进行作业测试一开始可能会感觉很奇怪,但这是惯用的。 (并且我在禁止它的语言中严重错过了这种行为。)