Как принять «только символы» или «только цифры» из консоли в C? - PullRequest
1 голос
/ 12 декабря 2011

Я пишу простое консольное приложение Objective-C.Я только хочу принять цифры.Даже если я наберу символ, который не является цифрой, он не должен возвращаться.и у меня должен быть массив символов со всеми цифрами, для которых я могу использовать atoi ().

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

Я просто хочу его изменить.

Есть ли какая-нибудь функция C, которая принимает только символи возвращает его, но не возвращает его обратно на экран?

Ответы [ 4 ]

1 голос
/ 12 декабря 2011

Символы отражаются программой терминала, а не вашей программой. Для управления терминалом необходимо использовать функцию termios .

Хотя ссылка на справочную страницу предназначена для Linux, она стандартизирована для всех вариантов UNIX.

Редактировать: Быстрый поиск Google нашел эту страницу: http://www.steve.org.uk/Reference/Unix/faq_4.html#SEC48

1 голос
/ 12 декабря 2011

Для получения дополнительной информации перейдите по этой ссылке Что эквивалентно getch () и getche () в Linux?

вы можете использовать getch (), но если нет getch (), вы можете попробовать следующий код.

#include <termios.h>
#include <stdio.h>

static struct termios old, new;

/* Initialize new terminal i/o settings */
void initTermios(int echo) 
{
  tcgetattr(0, &old); /* grab old terminal i/o settings */
  new = old; /* make new settings same as old settings */
  new.c_lflag &= ~ICANON; /* disable buffered i/o */
  new.c_lflag &= echo ? ECHO : ~ECHO; /* set echo mode */
  tcsetattr(0, TCSANOW, &new); /* use these new terminal i/o settings now */
}

/* Restore old terminal i/o settings */
void resetTermios(void) 
{
  tcsetattr(0, TCSANOW, &old);
}

/* Read 1 character - echo defines echo mode */
char getch_(int echo) 
{
  char ch;
  initTermios(echo);
  ch = getchar();
  resetTermios();
  return ch;
}

/* Read 1 character without echo */
char getch(void) 
{
  return getch_(0);
}

/* Read 1 character with echo */
char getche(void) 
{
  return getch_(1);
}

/* Let's test it out */
int main(void) {
  char c;
  printf("(getche example) please type a letter: ");
  c = getche();
  printf("\nYou typed: %c\n", c);
  printf("(getch example) please type a letter...");
  c = getch();
  printf("\nYou typed: %c\n", c);
  return 0;
} 

Функция Getch получает символы, но не выводит их на экран.

Спасибо

0 голосов
/ 12 декабря 2011

Позвольте мне представить вам красивый и элегантно простой скансет .

0 голосов
/ 12 декабря 2011

Изучите использование некоторой библиотеки терминала ввода-вывода (например, почтенного ncurses ), поскольку вам необходимо выполнить определенные для терминала вещи, чтобы сделать ввод терминала «необработанным», чтобы вы могли вводить по одному символу за раз и решите из вашей программы, будет ли этот символ отображаться или нет.

...