The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Как сделать, чтобы getchar не выдавал символ обратно"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

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

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Как сделать, чтобы getchar не выдавал символ обратно"  +/
Сообщение от vtuj (ok) on 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 сразу же выводится введенный символ.
Вопрос, как это подавить?

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Как сделать, чтобы getchar не выдавал символ обратно"  +/
Сообщение от pavlinux (ok) on 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!!!

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Как сделать, чтобы getchar не выдавал символ обратно"  +/
Сообщение от Вова on 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);

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

7. "Как сделать, чтобы getchar не выдавал символ обратно"  +/
Сообщение от vtuj (ok) on 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, а эффект тот же.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "Как сделать, чтобы getchar не выдавал символ обратно"  +/
Сообщение от pavlinux (ok) on 10-Июн-11, 18:34 
> а эффект тот же.

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

нету эффекта

-----

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


Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру