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

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

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

getch и TCHAR - C++

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

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

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

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

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

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

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

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

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

Не работает getch() - C++
не работает задержка по getchar() #include <iostream> #include <cstdlib> #include <time.h> #include <cstdio> #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.10.2012, 16:24  [ТС]     getch и TCHAR #21
-=ЮрА=-, выше на 4 сообщения моя часть кода.
-=ЮрА=-
12.10.2012, 16:37
  #22

Не по теме:


Цитата Сообщение от nexen Посмотреть сообщение
-=ЮрА=-, выше на 4 сообщения моя часть кода.
- Увидел
C++
1
2
3
4
5
6
while((simbol = getch()) != '\r')
    {
        login[i] = simbol;
        std::cout << simbol; 
            ++i;
    }
Хорошо посмотрим твой код с руссификацией чисто для плюсов (cin/cout) и чисто для Си(scanf/printf) пока под рукой нет MSVS 2008 и ничего толкового сказать не смогу

nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.10.2012, 17:47  [ТС]     getch и TCHAR #23
-=ЮрА=-, скажи, пожалуйста, а можно ли затирать символ и перемещать коретку в консоли? Хотелось бы сделать обработку BackSpace'а.
-=ЮрА=-
Заблокирован
Автор FAQ
12.10.2012, 18:54     getch и TCHAR #24
Цитата Сообщение от nexen Посмотреть сообщение
-=ЮрА=-, скажи, пожалуйста, а можно ли затирать символ и перемещать коретку в консоли? Хотелось бы сделать обработку BackSpace'а.
SetConsoleCursorPosition вот тут пример Форматирование текста и изменение цвета текста в консоли
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
12.10.2012, 19:53  [ТС]     getch и TCHAR #25
И всё-таки проблема с русским не решена ;( Без этого невозможно дальше работать.
p.s Как бы вопрос с записью и считыванием русских символов в файлы не встал..
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
12.10.2012, 21:50     getch и TCHAR #26
м.б. попробовать 4й фрэймворк установить? =) ну как вариант
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
13.10.2012, 07:04  [ТС]     getch и TCHAR #27
MrGrig, стоит.
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2012, 10:31     getch и TCHAR #28
Цитата Сообщение от nexen Посмотреть сообщение
И всё-таки проблема с русским не решена ;( Без этого невозможно дальше работать.
вот так можно по быстрому пофиксить
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <stdlib.h>
 
int main()
{
    char passw[12] = {0};//Будет хранить пароль
    system("chcp 866");
    printf("Enter password(less than 12 chars): ");
    for(int i = 0; i < 12; i++)
    {
        if((passw[i] = getch()) == '\r')
            break;
        else
            printf("*");
    }
    printf("\nYour input : %s\n",passw);//Понятное дело эту строку не надо печатать
    system("pause");
    return 0;
}
А вообще рекомендую не использовать ниsetlocal ни system("chcp xxx") а использовать CharToOem
Миниатюры
getch и TCHAR  
Вложения
Тип файла: rar nexenPassw.exe.rar (28.3 Кб, 1 просмотров)
Тип файла: rar nexenPassw_VS6and9_proj.rar (5.5 Кб, 1 просмотров)
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
13.10.2012, 10:45  [ТС]     getch и TCHAR #29
-=ЮрА=-, чуть позже гляну.
Я бы использовал либо CharToOem, либо MultiByteToUnicode (или как-то так) с TCHAR, если бы не
printf("привет"), где гораздо правильнее создать временный литерал, чем переменную, которую надо будет посылать в CharTo..
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2012, 12:11     getch и TCHAR #30
nexen, тогда напиши функцию преобразования:свой строковый литерал замени на контейнер std::string и делай переприсваивание внутри твоей функции сначала из контейнера во временный массив по которому проедит CharToOem,а затем из масива опять в контейнер,а сам временный массив удали
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
13.10.2012, 14:08  [ТС]     getch и TCHAR #31
-=ЮрА=-, и опять. 866 не помогает. То же самое, что без setlocale - ввод работает, printf("окей") нет. Это и при мультибайте в настройках, и при юникоде >_<
-=ЮрА=-
Заблокирован
Автор FAQ
14.10.2012, 00:05     getch и TCHAR #32
nexen, не слушаешь меня, ещё раз цитирую
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
nexen, тогда напиши функцию преобразования:свой строковый литерал замени на контейнер std::string и делай переприсваивание внутри твоей функции сначала из контейнера во временный массив по которому проедит CharToOem,а затем из масива опять в контейнер,а сам временный массив удали
Хорошо с кодом ниже думаю будет понятно о чём говорил

Не по теме:

(уточнение : в проекте нет std::string т.к я понял проект идёт как Сишный)


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <windows.h>
 
char * Rus(char * sMsg);
 
int main()
{
    char passw[12] = {0};//Áóäåò õðГ*Г*ГЁГІГј ГЇГ*ðîëü
    char szMsg[256]= {0};
    printf(Rus(strcpy(szMsg,"Ââåäèòå ГЇГ*ðîëü êîðî÷å 12 ñèìâîëîâ: ")));
    for(int i = 0; i < 12; i++)
    {
        if((passw[i] = getch()) == '\r')
            break;
        else
            printf("*");
    }
    printf(Rus(strcpy(szMsg,"\nГ‚Г*Гё ââîä : ")));
    printf("%s\n",passw);//ГЏГ®Г*ГїГІГ*îå äåëî ГЅГІГі ñòðîêó Г*ГҐ Г*Г*äî ГЇГҐГ·Г*ГІГ*ГІГј
    system("pause");
    return 0;
}
 
char * Rus(char * szMsg)
{
    char * szBuf = (char *)malloc(strlen(szMsg) + 1);
    if(CharToOem(szMsg, szBuf))
        strcpy(szMsg, szBuf);
    free((void *)szBuf);
    return szMsg;
}
Проект доджен идти НЕ как юникодный
Миниатюры
getch и TCHAR  
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
14.10.2012, 10:26  [ТС]     getch и TCHAR #33
-=ЮрА=-, да нет, почему же, я слушал тебя. То ли я забыл отписаться, что не хотелось бы использовать такой подход, то ли ты не увидел.
В конечном счете его и использую уже. Однако проект Unicode и всё работает (как и в мультибайте).. С чего бы это? О_о

p.s Правда я использую облегченную конструкцию вида :
C++
1
printf(Rus("it's okey to be гей"));
, где
C++
1
2
3
4
5
char* Rus(const char *text)
{
    CharToOemA(text, buffer);
    return buffer; 
}
, а buffer определен глобально.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2012, 10:54     getch и TCHAR
Еще ссылки по теме:

getch() error - C++
Привет всем, такое дело, не работает getch()! Вот, что пишет: C:\Users\AKHURS\Desktop\tetris_start.cpp:122: implicit declaration...

Функция getch() - C++
Здравствуйте! Проблема следующая: в программе для получения значений от пользователя я использовал функцию getch(), вызов этой функции в...

ошибка getch() - C++
программа с функцией getch() компилируется адекватно, но пр выполнении выскакивает такое окошко

Не работает getch() - C++
Здравствуйте, решил написать первую серьезную программу ,в данном случае змейку, не получается ввести нажатие клавиши с клавиатуры.После...

getch и коды - C++
здравствуйте господа програмисты!как сделать что бы при нажатии клавиши &quot;w&quot; выскакивало надпись привет народ,но только при нажатии именно...


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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
14.10.2012, 10:54     getch и TCHAR
  #34

Не по теме:

nexen,

Цитата Сообщение от nexen Посмотреть сообщение
а buffer определен глобально.
ну так да тоже можно, просто я привык к модульности потому дал код с malloc и free. От себя добавлю считаю, что лучше всего функцию Rus строить на контейнерах типа std::string или более продвинутом классе CString

Цитата Сообщение от nexen Посмотреть сообщение
Однако проект Unicode и всё работает (как и в мультибайте).. С чего бы это? О_о
- что такое юникод - символ выводится из двух байтов инфы, что такое узкая кодировка из двух байтов выводится 2 символа по байту, т.е для латиницы побарабану а для кириллицы не замечаем, т.к. CharToOem уже отдаёт 1-байтное представление кириллического символа, немного запутанно, но понимаю этот момент именно так

Yandex
Объявления
14.10.2012, 10:54     getch и TCHAR
Ответ Создать тему
Опции темы

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