Почему эти два метода возвращают разные вещи? - PullRequest
1 голос
/ 11 июня 2011

Итак ... Я пытался создать свой собственный простой кейлоггер, и это работает для вещей, набранных в оболочке, но если я дважды щелкну по исполняемому файлу, он просто помещает в файл много таких: ÿ

Я понимаю, что на данный момент, если я наберу 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 ]

3 голосов
/ 11 июня 2011

Возможно, потому что при двойном щелчке нет входного потока, или он сразу пуст.В этих условиях fgetc будет возвращать EOF непрерывно.Я не могу сказать точно, но это объясняет симптомы, которые вы видите.

Вам нужно сравнить input с EOF, чтобы увидеть, был ли найден конец потока, потому что в этомобстоятельства, вы никогда не получите возможность ввести j.Попробуйте изменить:

if (input==*"j")

на:

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

(вы заметили, что я изменил довольно ... необычную *"j" конструкцию на более простую 'j').

Возвращаемое значение из fgetc также должно быть int, поскольку оно должно представлять все возможные символы плюс EOF.

1 голос
/ 11 июня 2011
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 */
}

Помещение теста и в условие while поначалу может показаться странным, но это идиоматично. (И я очень скучал по этому поведению на языках, которые запрещают это.)

...