Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.89
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

getch и TCHAR - C++

11.10.2012, 20:44. Просмотров 2543. Ответов 33
Метки нет (Все метки)

Встала следующая задача :
1) Недопустить ввод кол-ва символов > 10
2) Заменить все символы на * (пароль)

Всё это прекрасно делается через getch() и английский язык. Но, если переходить на русский при помощи setlocale, тут уже не помогает. Выход есть - использовать tchar, который воспринимает русский, но и тут проблема, для неё нету никаких tgetch(). Что делать в этом случае? Нужно считать символ без эхо, проверить и затем уже решить, нужно эхо или нет (при этом все в tchar). Либо можно ли обычным char'ом считывать русские символы?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2012, 20:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос getch и TCHAR (C++):

getch - C++
что озночает ввод синволов с помощю getch без буферизации

getch - C++
Недавно начал изучать си++. Что-то написал, не знаю по какой причине не компилирует. Прошу помочь. Думаю проблема где-то в 12 строке. ...

getch() - C++
с помощью функции getch() узнал код клавиш... int n; n = getch(); cout << n;

getch() - C++
Здравствуйте, форумчане! написал программу, которая должна переводить миллион символов 16-го кода в двоичный, но столкнулся с...

Конвертация из TCHAR - C++
Всем доброго времени суток. Такой вопрос: как конвертировать числовую величину в TCHAR и обратно ?? Если кому-то нужен код, для того...

TCHAR Concatenation - C++
Добрый вечер. Начел изучать C++ и тут сталкнулся с совсем простой на взгляд задачай, но некак немагу решить. Есть поинтер TCHAR...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
12.10.2012, 08:01 #2
x,y/*координата курсорa по х и у где в данный момент буква*/
for(int i=0;i<20;i++,x++){
a=tchar();
gotoxy(x,y);
}
//Вы вводите 20 символов нажатие каждого фиксируется в цикле и тут же заменяется на символ *. так же в цикл можно вставить какие либо действия с переменной а или же орканизовать в виде массива. Единственный минус этой системы (с ходу который могу назвать) это то что у неё нет защиты от дурака. (имеется ввиду что пользователь вдруг не начнет жать энтер при вводе.

Добавлено через 1 минуту
функция gotoxy(), по моему, содержится в библиотеке windows.h
1
-=ЮрА=-
Заблокирован
Автор FAQ
12.10.2012, 12:12 #3
Цитата Сообщение от MrGrig Посмотреть сообщение
функция gotoxy(), по моему, содержится в библиотеке windows.h
- нет она не содержится это функция из БорландС graphics.h
Теперь на счёт проблемы :
Цитата Сообщение от nexen Посмотреть сообщение
Что делать в этом случае?
- всё решается переводом кодировки проекта из широкой в однобайтную (которая привычна глазу обывателя). Как это делать на скриншоте в этом посте
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.10.2012, 13:10  [ТС] #4
MrGrig, что за функция "tchar()"? Не смог её найти.
И всё-таки, есть ли функция, забирающая юникод-символ из буфера без эхо? Не хочется такие ухищрения с gotoxy делать

Добавлено через 4 минуты
-=ЮрА=-, getch() по прежнему не ловит русские символы. Даже с мультибайтом.
0
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
12.10.2012, 13:13 #5
Цитата Сообщение от nexen Посмотреть сообщение
MrGrig, что за функция "tchar()"? Не смог её найти.
И всё-таки, есть ли функция, забирающая юникод-символ из буфера без эхо? Не хочется такие ухищрения с gotoxy делать
я если честно в первый раз о ней слышу, просто предположил что вызов её идет именно такой как и гетч из
Цитата Сообщение от nexen Посмотреть сообщение
Выход есть - использовать tchar, который воспринимает русский
хотя я не помню чтобы у гетча были проблемы с восприятием русского алфавита, всегда в мэйне первым делом вставлял такую строчку
C++
1
setlocale(LC_ALL,".ACP");
или
C++
1
setlocale(LC_ALL,"Rus");
но скорее всего я ошибаюсь и это лишь даёт пользоваться корректным выводом в консоли
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.10.2012, 13:20  [ТС] #6
MrGrig, setlocale стоит
0
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
12.10.2012, 13:22 #7
nexen, ну как я и считал я ошибся
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.10.2012, 13:24  [ТС] #8
Основной цикл ввода :
C++
1
2
3
4
5
6
7
8
9
10
11
do
    {
        //scanf("%c", &simbol); // это я смотрел, правильно ли сканф считывает \ (неправильно считывает и он)
        simbol = _getch();
        if (i < STRING_SIZE-1 && simbol != (char)'\r\n')
        {
            login[i] = simbol;
            printf("%c", (char)simbol);
            ++i;
        }
    } while (simbol != (char)'\r\n');
где char simbol.
0
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
12.10.2012, 13:28 #9
* должно заменяться в реальном времени?
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.10.2012, 13:42  [ТС] #10
Цитата Сообщение от MrGrig Посмотреть сообщение
* должно заменяться в реальном времени?
Да, в противном случае встает вопрос о том, как же сделать ограничение на кол-во символов при вводе, ибо scanf_s не спасает.
Ну а пароли всегда заменяются на * в реальном времени
0
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
12.10.2012, 14:19 #11
я хз короче у меня на 7ке и без сетлокейт пашет=/ мож что не так задание понял

C++
1
2
3
4
5
6
7
8
9
char a1,a[100];
 int i;
 for(i=0;i<10;i++){
    a1=getch();
    a[i]=a1; //соответственно запись в масив для дальнейшей проверки на подлинность и тд и тп
    cout<<"*"; //вывод звездочек в реальном времени
 }
 a[i]='\0'; //ну это объяснять не надо
 cout<<endl<<a<<endl; //вывожу строку чтобы показать что все норм записалось
результат

[IMG]http://s017.***********/i441/1210/f6/2f3af4878834.png[/IMG]

Добавлено через 4 минуты
З.Ы. долго впоминал как чаровские масивы тут создаются были проблемы с присвоением сразу в массив, поэтому пользовался переменной дополнительно, но работает и без неё
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.10.2012, 14:56  [ТС] #12
MrGrig, О_о.. У тебя мультибайт стоит?
У меня такой фокус не прокатывает D:

Добавлено через 30 минут
таки да, без setlocale символы отображаются верно, но тогда я не могу писать как-то так :
printf("Привет");
0
-=ЮрА=-
Заблокирован
Автор FAQ
12.10.2012, 15:10 #13
nexen, делается всё элементарно без всяких гетчей и в рамках функций ввода/выода одобренных в стандарте(gecth же атавизм от дос и не входит в стандарт)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <string>
#include <iostream>
using namespace std;
 
int main()
{
    string passw;//Áóäåò õðГ*Г*ГЁГІГј ГЇГ*ðîëü
    char smbl = 0;
    system("chcp 1251");//Если компилятор новый поставь вместо этого setlocale(LC_ALL,"RUS");
    cout<<"Enter password : ";
    while((smbl = getchar()) != '\n')
        passw += smbl;
    cout<<passw<<endl;
    system("pause");
    return 0;
}
Вводим последовательно псимволы для пароля, а после жмём Энтер.
0
Миниатюры
getch и TCHAR  
-=ЮрА=-
Заблокирован
Автор FAQ
12.10.2012, 15:15 #14
А вот код для звёздочек при вводе
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <string>
#include <conio.h>
#include <iostream>
using namespace std;
 
int main()
{
    string passw;//Будет хранить пароль
    char smbl = 0;
    system("chcp 1251");
    cout<<"Enter password : ";
    while((smbl = getch()) != '\r')
    {
        cout<<"*";
        passw += smbl;
    }
    cout<<"\nYour input : "<<passw<<endl;//Понятное дело єту строку не надо печатать
    system("pause");
    return 0;
}
1
Миниатюры
getch и TCHAR  
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.10.2012, 15:32  [ТС] #15
Попробовал и на мультибайте и на юникоде. printf/cout. Одно и то же. Русские символы при печати выводятся корректно без setlocale, но тогда вопрос в printf("введите"), а с setlocale, все нормально при printf("окей"), но не при вводе.

-=ЮрА=-,
программа :
C++
1
2
3
4
5
6
7
 while((simbol = getch()) != '\r')
    {
        login[i] = simbol;
            //printf("%c", simbol);
        std::cout << simbol;
            ++i;
    }
то, что появляется в командной строке
0
Изображения
 
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2012, 15:32
Привет! Вот еще темы с ответами:

TCHAR to int - C++
Помогите, пожалуйста, исправить ошибку в программе. //программа выводит время песни в мс #include &quot;stdafx.h&quot; # include &lt;stdio.h&gt; ...

TCHAR и string - C++
Здраствуйте! Неполучается сконвертировать string в TCHAR. string myString; TCHAR myStr = myString; PS.

Вывод TCHAR - C++
Как я понял, наиболее лучшее решение для работы со строками с возможностью &quot;быстрой&quot; перекомпиляции с поддержкой unicode и без -...

аналог getch() - C++
Ребят getch меня не устраивает следующим: когда окно теряет фокус он не работает. как выйти из ситуации?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.10.2012, 15:32
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru