Форум русскоязычного сообщества Ubuntu


Автор Тема: замена символов входного потока в С  (Прочитано 789 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Sеr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 60
  • Познаю мир, пока не в вузе...
    • Просмотр профиля
Здравствуйте!
Мне нужно сделать программу, которая требует ввода пароля и записывает его в файл.
Все реализовано, но осталась небольшая недоработка - при вводе символов они должны заменятся на ' * '. У меня не получается реализовать это.
Не могли бы вы подсказать, как должна выглядеть подобная функция?
P.S. Вот моя (нерабочая) версия:
(Нажмите, чтобы показать/скрыть)


Оффлайн Sеr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 60
  • Познаю мир, пока не в вузе...
    • Просмотр профиля
Re: замена символов входного потока в С
« Ответ #2 : 14 Июнь 2011, 13:25:08 »
а какую нибудь другую версию нельзя написать?
мне не хочется работать с тем, что мне пока что неизвестно..

andrey_p

  • Гость
Re: замена символов входного потока в С
« Ответ #3 : 14 Июнь 2011, 13:29:50 »
Нет. Если под Линукс, то это только через управление терминалом. Можно немного проще через system и stty - но это немного через задницу. Все завязано на терминалах (исторически) и echo можно отключить только через системный вызов. А \b не работает, потому что буферизируется. Можно отключить, но это те же самые заморочки.
« Последнее редактирование: 14 Июнь 2011, 13:36:03 от andrey_p »

Оффлайн Sеr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 60
  • Познаю мир, пока не в вузе...
    • Просмотр профиля
Re: замена символов входного потока в С
« Ответ #4 : 14 Июнь 2011, 13:49:44 »
А нельзя ли сделать так, чтобы сигналы с клавиатуры напрямик поступали в переменную, в обход терминала?
Тоесть набрал я на клаве "Ser" и это сразу записалось бы в мой массив, а терминал бы даже не заметил действий с моей стороны.
Возможно такое?

andrey_p

  • Гость
Re: замена символов входного потока в С
« Ответ #5 : 14 Июнь 2011, 14:10:22 »
Можно. Ядро пропатчить. :) Схема работы консольной программы такая:

(виртуальный) терминал <-> ядро <-> твоя программа.

Запустившись, твоя программа получает терминал, с которого была запущена (или не получает, если отсоединена, как демоны). Получив запрос на ввод с stdin, ядро смотрит откуда его может получить (из канала или файла), не найдя, терпеливо ждет, когда пользователь введет что-то с терминала. Каждый введенный символ попадает в ядро и, помимо прочих действий, отправляется обратно на терминал. Это называется эхо. Чтоб его отключить, надо послать специальный системный вызов ядру, что и делает функция-заменитель в ссылке, которую я дал.

Можно, конечно, вместо stdio использовать библиотеки gui или framebuffer, тогда терминал никакого отношения к работе программы иметь не будет. Но это и не будет простой консольной программой.
« Последнее редактирование: 14 Июнь 2011, 14:12:25 от andrey_p »

Оффлайн Sеr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 60
  • Познаю мир, пока не в вузе...
    • Просмотр профиля
Re: замена символов входного потока в С
« Ответ #6 : 14 Июнь 2011, 14:15:04 »
ахринеть. чувствую, забредаю в дебри =)
надо будет разобраться -_-

Пользователь решил продолжить мысль 14 Июнь 2011, 14:17:45:
о. доперло.
Тоесть, здесь эта функция во время выполнения программы должна работать вместо echo?
Я отключаю эхо и ставлю заместо него свою функцию. она получает данные, как и эхо, но выводит на экран не то, что получила, а выводит звездочку при каждом новом получении символа.
я правильно понял?
« Последнее редактирование: 14 Июнь 2011, 14:17:45 от Sеr »

andrey_p

  • Гость
Re: замена символов входного потока в С
« Ответ #7 : 14 Июнь 2011, 14:21:02 »
Должно работать:

system("stty -echo");
// ввод пароля
system("stty echo");

Но это, конечно, немного, не то.

===

Цитировать
Я отключаю эхо и ставлю заместо него свою функцию. она получает данные...
Вот это предложение правильное (почти), остальное все нет, ну будешь писать - разберешься. О звездочках - чтоб они отражались, надо еще и отключить буферизацию (ну это через setvbuf).

ЗЫ Правильно так - отключаешь эхо, получаешь ввод, включаешь эхо. По идее, если отключить буферизацию, то должен сразу отражаться твой вывод (то бишь звездочки).




Пользователь решил продолжить мысль 14 Июнь 2011, 14:56:34:
(Нажмите, чтобы показать/скрыть)

Отключать буферизацию надо будет и в ядре, и, видимо, в стандартной библиотеке.
« Последнее редактирование: 14 Июнь 2011, 14:57:38 от andrey_p »

Оффлайн Sеr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 60
  • Познаю мир, пока не в вузе...
    • Просмотр профиля
Re: замена символов входного потока в С
« Ответ #8 : 14 Июнь 2011, 15:39:53 »
чтоль еще дополнительно посмотреть учебник bash-скриптов..ато копипастить не получается :DD

 

Страница сгенерирована за 0.216 секунд. Запросов: 24.