ANSI C ввод без клавиатуры - PullRequest
       66

ANSI C ввод без клавиатуры

3 голосов
/ 17 февраля 2009

Я гуглил без удачи. Я ищу способ сделать getc () или gets () или что-то, что не отражается на терминале. Я видел kbhit (), но это не является частью ANSI. В идеале я хотел бы, чтобы код был похож на

char s[100];
no_echo_gets(s); /* Won't echo to screen while being typed */
printf("%s\n", s);

Кто-нибудь знает хороший ANSI-совместимый способ сделать это?

Ответы [ 8 ]

7 голосов
/ 17 февраля 2009

Для UNIX-подобных систем вы хотите играть с флагом ECHO ...

#include <termios.h>
...
struct termios t;
tcgetattr(fd, &t);
t.c_lflag &= ~ECHO;
tcsetattr(fd, TCSANOW, &t);
...
5 голосов
/ 24 сентября 2012

Команда getpass присутствует в Linux. Но вы можете сделать более симпатичную версию, одно только системное эхо не убивает необходимость в команде ввода, в то время как подавление буферизации не убивает возврат каррейга после ввода данных. Сочетание двух дает хорошее приближение тихой записи. Вы можете добавить звездочку, чтобы создать секретную запись, поэтому здесь есть комбинация из двух предложений:

    #include <stdio.h>
    #include <termios.h>
    #include <unistd.h>
    int getche(void);
    int main(int argc, char **argv){
    int i=0;       
    char d,c='h',s[6];
    printf("Enter five secret letters\n");
    s[5]='\0'; //Set string terminator for string five letters long
    do{
      d=getche();//Fake getche command silently digests each character
    printf("*");
      s[i++]=d;} while (i<5);
    printf("\nThank you!!\n Now enter one more letter.\n");
    c=getchar();
    printf("You just typed %c,\nbut the last letter of your secret string was %c\n",c,d);   
    printf("Your secret string was: %s\n",s);   
        return 0;
    }
    /* reads from keypress, echoes */
        int getche(void)
        {
            struct termios oldattr, newattr;
            int ch;
            tcgetattr( STDIN_FILENO, &oldattr );
            newattr = oldattr;
            newattr.c_lflag &= ~( ICANON | ECHO);\\knock down keybuffer
            tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
            system("stty -echo");\\shell out to kill echo
            ch = getchar();
            system("stty echo");
            tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
            return ch;
        }
4 голосов
/ 17 февраля 2009

Вы не можете сделать это кросс-платформенным способом, используя ANSI C. Вам придется использовать некоторый специфичный для ОС код или использовать библиотеку, такую ​​как ncurses .

2 голосов
/ 22 мая 2011

Может быть, вы можете попробовать так:

#include<stdio.h>
char s[100];
system("stty -echo");
scanf("%s",s); /* Won't echo to screen while being typed */
system("stty echo");
printf("You have entered:");
printf("%s\n", s);
return 0;
}

В Linux системная функция "stty -echo" вводит sth без эха Надеюсь, это поможет.

2 голосов
/ 17 февраля 2009

Поскольку ваша задача довольно проста, если вам повезет, ваша система будет иметь функцию getpass():

char * getpass(const char *prompt);

Если вам не нужна подсказка, просто сделайте:

char *s = getpass("");
if (s != NULL)
    printf("Your password was %s!\n", s);

getpass(), как и все функции C, связанные с эхом и буферизацией, нестандартны, но присутствуют в Mac OS X, возможно, Linux, и перечислены в библиотеке GNU C, поэтому, вероятно, присутствует в любой системе, использующей glibc.

Стандарты ANSI и ISO, как указывалось ранее, не определяют стандартный способ чтения ввода без эха или чтения небуферизованного ввода (т. Е. По символу за раз).

0 голосов
/ 17 февраля 2009

ANSI и ISO C не определяют эту функциональность, однако большинство компиляторов C имеют getch () или близкий вариант.

Вам нужно будет определить определение препроцессора для каждого используемого вами компилятора, у которого есть разные библиотека и функция для этого. Это не сложно, хотя вы можете счесть это раздражающим.

-Adam

0 голосов
/ 17 февраля 2009

Это будет зависеть от вашей среды, это не то, что обеспечивает язык. Если вы собираетесь выполнять расширенный ввод / вывод в символьном режиме, вы можете посмотреть в библиотеку как проклятия. В противном случае вам придется управлять терминалом или консолью Windows вручную.

0 голосов
/ 17 февраля 2009

Нет ни одного; ни ANSI C, ни ISO C ++ не имеют такой вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...