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

Стирание знака - C++

Восстановить пароль Регистрация
 
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
23.06.2013, 12:04     Стирание знака #1
Здравствуйте! Хочу сделать так, чтоб можно было стирать(визуально) один символ при вводе строки с помощью getche(). Кто знает как это можно сделать?
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
void get_str(char* str)
{
    int count = 0;
    do
    {
        if(count == SZ)
        {
            cout << endl << "Строка может содержать только " << SZ - 1 << " символов." << endl
                << "Попрубуйте ещё раз." << endl;
            count = 0;
        }
        *(str + count) = getche();
        if(*(str + count) == 8)
        {
            *(str + count - 1) = '\0';
            cout << endl << str;
            count -= 2;
        }
        count++;
    }while(*(str + (count - 1)) != '\r');
    
    str[count - 1] = '\x0';
    cout << endl;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2013, 12:04     Стирание знака
Посмотрите здесь:

C++ Стирание старых отрисовок.
Ввод знака пробела C++
Стирание надписи с экрана C++
Кодировка знака ± C++
C++ Как добавить стирание символов в программе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
26.06.2013, 02:31     Стирание знака #2
*(str + count) - так писать нехорошо. Чем str[count] не нравится ?

Ответ собственно на вопрос: печатай символ backspace.
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
26.06.2013, 21:44  [ТС]     Стирание знака #3
А можно пожалуйста код привести, а то у меня не получается... Backspace работает, но вот символы не удаляются, просто курсор переходит на символ назад. Я хочу, чтоб backspace работал как с cin...
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
26.06.2013, 22:03     Стирание знака #4
Когда-то работало, странно.
Тогда на backspace печатай "бекспейс", "пробел", "бекспейс"

Добавлено через 24 секунды
Есть, вероятно, что-то более удобное, но я не в курсе.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
26.06.2013, 22:07     Стирание знака #5
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
*(str + count) - так писать нехорошо.

Не по теме:

почему?

Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
26.06.2013, 22:16     Стирание знака #6
Единые стандарты улучшают понимание. Когда ты пишешь код, неплохо бы стремиться, что его можно было понять как можно быстрей.
С этой точки зрения, когда я вижу str[count], я сразу понимаю, о чём идёт речь.
А выражение вида *(str+count) - это хммм, зачем он к строке что-то прибавляет. Ага, инкрементирует указатель и разыменовывает.

Зачем ? Показать, что ты понимаешь, как работает С++ ?

Кроме того, теперь код не так просто обновить до использования std::string, к примеру, где код с разыменованием уже не пройдёт.

В общем, если коротко - принцип бритвы Оккама.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
26.06.2013, 22:22     Стирание знака #7
с другой стороны, многие программы потеряли бы свою зрелищность и компактность, если использовать индексирование, особенно работа с n-мерными массивами.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
26.06.2013, 22:27     Стирание знака #8
Ну, это скорее программирование ради программирования. Есть, к примеру, язык brainfuck и в нём есть своя прелесть.
Зрелищность очень часто входит в конфликт с прагматичностью, согласен.

Про многомерные массивы трудно что-то сказать, у меня с массивами больше 2мерных опыта использования почти нет.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.06.2013, 23:33     Стирание знака #9
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
void get_str(char* str)
{
    int count = 0;
    char ch;
    do
    {
        if(count == SZ)
        {
            cout << endl << "Строка может содержать только " << SZ - 1 << " символов." << endl
                << "Попрубуйте ещё раз." << endl;
            count = 0;
        }
        ch = getche();
        if(ch == 8)
        {   
            if (count != 0)
            {
                putch(' ');
                putch(8);
                count -= 1;
            }
        }
        else
        {
            str[count] = ch;
            count++;
        }
        
    } while (str[count - 1] != '\r');
    
    str[count - 1] = '\x0';
    cout << endl;
}
Добавлено через 46 минут
Исключение ввода пустой строки:
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
34
void get_str(char* str)
{
    int count = 0;
    char ch;
    do
    {
        if(count == SZ)
        {
            cout << endl << "Строка может содержать только " << SZ - 1 << " символов." << endl
                << "Попрубуйте ещё раз." << endl;
            count = 0;
        }
        ch = getche();
        if(ch == 8)
        {   
            if (count != 0)
            {
                putch(' ');
                putch(8);
                count -= 1;
            }
        }
        else if (ch != '\r')
        {
            str[count] = ch;
            count++;
        }
        
    } while (ch != '\r' || count == 0);
    
    ++count;
    str[count - 1] = '\x0';
    cout << endl;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2013, 23:40     Стирание знака
Еще ссылки по теме:

Считывание строки до знака '\n' C++
C++ Ввод знака + или -
C++ Проверка знака числа

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

Или воспользуйтесь поиском по форуму:
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
26.06.2013, 23:40  [ТС]     Стирание знака #10
Всем спасибо! Вывожу дополнительно " " и backspace и всё работает.
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
void get_str(char* str)
{
    int count = 0;
    char ch = 8;
    do
    {
        if(count == SZ)
        {
            cout << endl << "Строка может содержать только " << SZ - 1 << " символов." << endl
                << "Попрубуйте ещё раз." << endl;
            count = 0;
        }
        *(str + count++) = getche();
        if(*(str + count - 1) == 8)
        {
            if(count != 1)
            {
                cout << " " << ch;;
                count -= 2;
            }
            else
                count--;
        }
    }while(*(str + (count - 1)) != '\r');
    str[count - 1] = '\x0';
    cout << endl;
}
Yandex
Объявления
26.06.2013, 23:40     Стирание знака
Ответ Создать тему
Опции темы

Текущее время: 15:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru