1

だから...私は自分のシンプルなキーロガーを作ろうとしていて、これはシェルで入力されたもので機能しますが、実行可能ファイルをダブルクリックすると、これらの多くがファイルに入れられます:ÿ

今のところ、入力する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;
}
4

2 に答える 2

3

おそらく、ダブルクリックしたときに入力ストリームがないか、すぐに空になっているためです。それらの条件では、継続的fgetcに戻りEOFます。はっきりとは言えませんが、それはあなたが見ている症状を説明しています。

ストリームの終わりが見つかったかどうかを確認するために比較する必要があります。そのような状況では、を入力する機会が得られないinputためです。変更してみてください:EOFj

if (input==*"j")

に:

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

(私がかなり...珍しい*"j"xonstructをより単純なものに変更したことに気付くでしょう'j')。

からの戻り値fgetcも、int​​可能なすべての文字に加え EOFてを表す必要があるため、である必要があります。

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

戻り値には( -よりも大きいものが一般的です)がfgetc()必要であることに注意してください:は、取る可能性のある値に加えて、可能な戻り値です。intcharintEOFchar

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 に答える