URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9158
[ Назад ]

Исходное сообщение
"Как сделать, чтобы getchar не выдавал символ обратно"

Отправлено vtuj , 09-Июн-11 20:03 
Добрый день!
Вопрос, наверное, ламерский, но все же, подскажите.
Обращаюсь с функции getchar(), а на экран при этом выаодится нажатый символ. Надо, чтобы он не выводился, как, если бы мне надо было ввести пароль. Но идея состоит не в этом, просто у меня stdin и stdout связаны с com портом, а конкретнее, с модемом. Получается, что все символы, приходящие от удаленного модема возвращаются ему назад. А это для меня плохо.
Может кто знает, как сделать такое?

Содержание

Сообщения в этом обсуждении
"Как сделать, чтобы getchar не выдавал символ обратно"
Отправлено pavlinux , 10-Июн-11 00:00 
> Добрый день!
> Вопрос, наверное, ламерский, но все же, подскажите.
> Обращаюсь с функции getchar(), а на экран при этом выаодится нажатый символ.

Кривой у вас что-то, getchar не занимается выводом на экран.
  


"Как сделать, чтобы getchar не выдавал символ обратно"
Отправлено vtuj , 10-Июн-11 17:23 
>> Добрый день!
>> Вопрос, наверное, ламерский, но все же, подскажите.
>> Обращаюсь с функции getchar(), а на экран при этом выаодится нажатый символ.
> Кривой у вас что-то, getchar не занимается выводом на экран.

Может быть и кривой
Freebsd 8.2
gcc

Вот текст программы:
----------------------------------
#include <stdio.h>

int main ()
{ char buf [256];
  int ch, pnt;
  pnt = 0;
  while ((ch = getchar()) != EOF)
  { buf [pnt] = ch + 1;
    if (ch == 10)
    { buf [pnt] = 0;
      puts (buf);
      pnt = 0;
    }
    else pnt ++;
  }
}
---------------------------------------

Если после запуска программы ввожу с клавиатуры
12345
то на экране будут две строки
12345
23456
Проясните, пожалуйста, откуда берется строка
12345
ведь, едиственный оператор вывода это pus (buf), который выводит строку
23456
Поэтому делаю вывод, что при нажатии клавиши на stdout сразу же выводится введенный символ.
Вопрос, как это подавить?


"Как сделать, чтобы getchar не выдавал символ обратно"
Отправлено pavlinux , 10-Июн-11 17:43 
>[оверквотинг удален]
>   { buf [pnt] = ch + 1;
>     if (ch == 10)
>     { buf [pnt] = 0;
>       puts (buf);
>       pnt = 0;
>     }
>     else pnt ++;
>   }
> }
> ---------------------------------------

puts (buf); - вот он гад


>[оверквотинг удален]
> то на экране будут две строки
> 12345
> 23456
>  Проясните, пожалуйста, откуда берется строка
> 12345
> ведь, едиственный оператор вывода это pus (buf), который выводит строку
> 23456
> Поэтому делаю вывод, что при нажатии клавиши на stdout сразу же выводится
> введенный символ.
> Вопрос, как это подавить?

Не выводить на stdout!!!


"Как сделать, чтобы getchar не выдавал символ обратно"
Отправлено vtuj , 10-Июн-11 17:49 
>[оверквотинг удален]
>> то на экране будут две строки
>> 12345
>> 23456
>>  Проясните, пожалуйста, откуда берется строка
>> 12345
>> ведь, едиственный оператор вывода это pus (buf), который выводит строку
>> 23456
>> Поэтому делаю вывод, что при нажатии клавиши на stdout сразу же выводится
>> введенный символ.
>> Вопрос, как это подавить?

В смысле виноват puts?


"Как сделать, чтобы getchar не выдавал символ обратно"
Отправлено pavlinux , 10-Июн-11 18:05 
>[оверквотинг удален]
>>> 12345
>>> 23456
>>>  Проясните, пожалуйста, откуда берется строка
>>> 12345
>>> ведь, едиственный оператор вывода это pus (buf), который выводит строку
>>> 23456
>>> Поэтому делаю вывод, что при нажатии клавиши на stdout сразу же выводится
>>> введенный символ.
>>> Вопрос, как это подавить?
> В смысле виноват puts?

Ну что значит виноват, у него миссия такая - выводить на stdout,
от начала адреса указываемое в аргументе.

if (ch == 10) - ждет кода 0x0A, он жe LF, он же '\n', он же ENTER


"Как сделать, чтобы getchar не выдавал символ обратно"
Отправлено Вова , 10-Июн-11 18:05 
> Добрый день!
> Вопрос, наверное, ламерский, но все же, подскажите.
> Обращаюсь с функции getchar(), а на экран при этом выаодится нажатый символ.
> Надо, чтобы он не выводился, как, если бы мне надо было
> ввести пароль. Но идея состоит не в этом, просто у меня
> stdin и stdout связаны с com портом, а конкретнее, с модемом.
> Получается, что все символы, приходящие от удаленного модема возвращаются ему назад.
> А это для меня плохо.
> Может кто знает, как сделать такое?

    struct termios settings;
    tcgetattr(0, &settings);
//не отображаем введённые символы
    settings.c_lflag &= ~ECHO;
//не ждём нажатия интер
    settings.c_lflag &= ~ICANON;
    tcsetattr(0, TCSANOW, &settings);


"Как сделать, чтобы getchar не выдавал символ обратно"
Отправлено vtuj , 10-Июн-11 18:28 
>[оверквотинг удален]
>> Получается, что все символы, приходящие от удаленного модема возвращаются ему назад.
>> А это для меня плохо.
>> Может кто знает, как сделать такое?
>     struct termios settings;
>     tcgetattr(0, &settings);
> //не отображаем введённые символы
>     settings.c_lflag &= ~ECHO;
> //не ждём нажатия интер
>     settings.c_lflag &= ~ICANON;
>     tcsetattr(0, TCSANOW, &settings);

Спасибо, сейчас попробую!
А на версию с puts приготовил программу другую
---------------------------------------------------
#include <stdio.h>

int main ()
{ char buf [256];
  int ch, pnt;
  FILE *fl;
  fl = fopen ("qq", "w");
  pnt = 0;
  while ((ch = getchar()) != EOF)
  { buf [pnt] = ch + 1;
    if (ch == 10) break;
    pnt ++;
  }
  buf [pnt] = 0;
  fputs (buf, fl);
  fclose (fl);
}
---------------------------------------------------

В ней нет puts, а есть fputs, а эффект тот же.


"Как сделать, чтобы getchar не выдавал символ обратно"
Отправлено pavlinux , 10-Июн-11 18:34 
> а эффект тот же.

# echo "1111" | ./a.out
# cat qq
2222

нету эффекта

-----

Можно вопрос: Напурква нужно  buf[pnt] = ch + 1;



"Как сделать, чтобы getchar не выдавал символ обратно"
Отправлено vtuj , 10-Июн-11 18:44 
> Можно вопрос: Напурква нужно  buf[pnt] = ch + 1;

А для того, чтобы различать, что ввожу,а что вывожу

Всем большое спасибо за помощь.
Все получилось с tcgetattr и tcsetattr.
А то замучился фильтровать сообщения, ведь я работал не с клавиатуры,а через модем с удаленным сервером.