8 / 8 / 6
Регистрация: 21.04.2018
Сообщений: 142
1

Функция getline и битовые операции

10.07.2018, 11:20. Показов 616. Ответов 9

Author24 — интернет-сервис помощи студентам
Доброго времени суток Всем. Нужна мааааленькая помощь в написанной мною ниже программе. cin.getline как-то неправильно работает, например, вводя текст и нажимая Enter, ввод продолжается до тех пор, пока размер текста не пересечёт заданный лимит (size). Знаю, что дело в нуль-терминаторе, пробовал ставить в функцию \n вместо \0, но при написании размера массива и нажатии Enter пропускается ввод текста. Что делать? (P.S. маленькое описание программы: она позволяет добавить разные стили в введённый юзэром текст, используя 8 битов, под которые эти стили и выделены)

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
#include <Windows.h>
 
using namespace std;
 
enum Mask
{
    UPPER = 128,
    SPACE_BETWEEN_LETTERS = 64,
    NEWLINE = 32,
    NOTHING = 16,
    COLOR_AQUA = 8,
    COLOR_GREEN = 4,
    COLOR_BLUE = 2,
    COLOR_BLACK = 1
 
};
 
void uppercase(char str[]) {
    char* step = str;
    while (*step != '\0') {
        *step = toupper(*step); // позволяет сделать буквы заглавными
        ++step;
    }
}
 
void lowercase(char str[]) {
    char* step = str;
    while (*step != '\0') {
        *step = tolower(*step);
        ++step;
    }
}
 
void space_between_letters(char *&str)
{
    size_t tmp_size = strlen(str) * 2;
    char *tmp = new char[tmp_size];
 
    for (size_t i = 0, j = 0; j < tmp_size;)
    {
        if (j % 2 == 0 && str[i] != ' ') {
            tmp[j] = ' ';
        }
        else {
            tmp[j] = str[i];
            ++i;
        }
        ++j;
    }
    tmp[tmp_size - 1] = '\0';
    delete[] str;
    str = tmp;
}
 
void new_line(char *&str)
{
    str[strlen(str)] = '\n';
}
 
void nothing()
{
    cout << "\n OMG, nothing happened! (kidding: this cout was activated) \n";
}
 
void main() {
    setlocale(LC_ALL, "Russian");
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
 
    unsigned char settings = 0;
    int size;
    cout << "Введите размер строки: ";
    cin >> size;
 
    char *str = new char[size] {'\0'};
    strcpy(str, "Some text for test");
    char user_choise;
 
    cout << "Введите саму строку: ";
    cin.getline(str, size, '\0');
 
    system("cls");
    
    cout << "Большие (U) или маленькие (L) буквы? (U/L) \n Ваш выбор: ";
    cin >> user_choise;
    
    if (user_choise == 'U')
        settings = Mask::UPPER;
    else
        lowercase(str);
 
    system("cls");
    
    cout << "Ставить ли пробелы между буквами? (Y/N) \n Ваш выбор: ";
    cin >> user_choise;
        
    if (user_choise == 'Y')
        settings = Mask::SPACE_BETWEEN_LETTERS;
    
    system("cls");
    
    cout << "Ставить ли Enter (\\n) после текста? (Y/N) \n Ваш выбор: ";
    cin >> user_choise;
    
    if (user_choise == 'Y')
        settings = Mask::NEWLINE;
    
    system("cls");
 
    cout << "Вызвать ли nothing? (Y/N) \n Ваш выбор: ";
    cin >> user_choise;
 
    if (user_choise == 'Y')
        settings = Mask::NOTHING;
    system("pause");
 
    system("cls");
 
    cout << "Выберите цвет Вашей строки: \n";
    cout << "\t 3) Aqua \n";
    cout << "\t 2) Green \n";
    cout << "\t 1) Blue \n";
    cout << "\t 0) Black \n";
    cout << " \n Ваш выбор: ";
 
    cin >> user_choise;
 
    if (user_choise == '3') {
        settings = Mask::COLOR_AQUA;
    }
 
    if (user_choise == '2') {
        settings = Mask::COLOR_GREEN;
    }
 
    if (user_choise == '1') {
        settings = Mask::COLOR_BLUE;
    }
 
    if (user_choise == '0') {
        settings = Mask::COLOR_BLACK;
    }
 
    if ((settings & Mask::UPPER) == Mask::UPPER) {
        uppercase(str);
    }
 
    if ((settings & Mask::SPACE_BETWEEN_LETTERS) == Mask::SPACE_BETWEEN_LETTERS) {
        space_between_letters(str);
    }
 
    if ((settings & Mask::NEWLINE) == Mask::NEWLINE) {
        new_line(str);
    }
 
    if ((settings & Mask::NOTHING) == Mask::NOTHING) {
        nothing();
    }
 
    if ((settings & Mask::COLOR_AQUA) == Mask::COLOR_AQUA) {
        SetConsoleTextAttribute(h, 3);
    }
 
    if ((settings & Mask::COLOR_GREEN) == Mask::COLOR_GREEN) {
        SetConsoleTextAttribute(h, 2);
    }
 
    if ((settings & Mask::COLOR_BLUE) == Mask::COLOR_BLUE) {
        SetConsoleTextAttribute(h, 1);
    }
 
    if ((settings & Mask::COLOR_BLACK) == Mask::COLOR_BLACK) {
        SetConsoleTextAttribute(h, 0);
    }
 
    cout << "Строка, которая вышла: " << str << endl;
 
 
    delete[] str;
    system("pause");
 
    exit(1);
}
Добавлено через 1 минуту
(заметка для gru74ik): всё-таки нужно использовать не строку, а char* str.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2018, 11:20
Ответы с готовыми решениями:

Битовые операции, битовые поля.
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций....

Битовые последовательности и битовые операции
Вычислить сумму по модулю 2 всех бит в позициях, номер которых кратен 2^k. (1, 2, 4, 8, 16, 32). ...

Используя только битовые операции и операции арифметического сложения и вычитания, вычислите число
Даны числа x и y. Используя только битовые операции и операции арифметического сложения и...

Битовые операции и операции смещения языка С
Доброго времени суток господа,помогите пожалуйста.Есть 2 кода к задаче,первый работает...

9
186 / 171 / 93
Регистрация: 13.06.2018
Сообщений: 708
10.07.2018, 11:31 2
Цитата Сообщение от N0VY Посмотреть сообщение
strcpy(str, "Some text for test");
а какой до этого был сайз? чревато за динамическую память вылезать
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
10.07.2018, 11:41 3
Цитата Сообщение от N0VY Посмотреть сообщение
(заметка для gru74ik): всё-таки нужно использовать не строку, а char* str.
N0VY, это самостоятельно. Мне такое не интересно.
0
8 / 8 / 6
Регистрация: 21.04.2018
Сообщений: 142
10.07.2018, 12:23  [ТС] 4
Biger18, любой. Вводим его через cin. Или так нельзя делать?
0
186 / 171 / 93
Регистрация: 13.06.2018
Сообщений: 708
10.07.2018, 12:29 5
можно,если он>strlen("Some text for test")
0
8 / 8 / 6
Регистрация: 21.04.2018
Сообщений: 142
10.07.2018, 15:58  [ТС] 6
Ну... пардон. Не тот случай. Тогда не динамический массив.

Добавлено через 3 часа 27 минут
Ну так что: как чё делать? Размер, допустим, 50 символов максимум. И без дин. массивов.
0
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
10.07.2018, 16:40 7
В распространённых ошибках прочитай про оставление '\n'.
1
8 / 8 / 6
Регистрация: 21.04.2018
Сообщений: 142
11.07.2018, 15:57  [ТС] 8
Спасибо большое, решил проблему, исправив код такой вещью:
C++
1
2
cin.ignore(size, '\n');
cin.getline(str, size, '\n');
Теперь, последняя проблема: при вводе строки на русском языке выводится елесть. Как мне это исправить? (ноут: setlocale(LC_ALL, "Russian"); стоит)

Добавлено через 3 часа 34 минуты
Кстати, вот скрины того, что происходит: то, что введено (параметры: пробелы между буквами, верхний регистр, синий цвет, \n)
Функция getline и битовые операции

и то, что вышло
Функция getline и битовые операции
0
Комп_Оратор)
Эксперт по математике/физике
8948 / 4702 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
11.07.2018, 16:32 9
C++
1
2
3
4
5
6
7
8
9
10
Сквозь тёрен рвётся олень,
Лосось стремится на нерест,
Как бабочка на огонь,
На грабли идёт новичок...
 
Всё словно замерло в танце,
И солнце повисло недвижно.
Но в этот священный миг,
Муха летит не туда.
                          /Акода Прогоремуши/
Попробуйте просто getline(cin, str);. И ещё #include <locale.h> а потом в main setlocale(0,"rus");. Ну и Lucida Console для окна (см. русские шрифты в консоли).
0
7784 / 6553 / 2982
Регистрация: 14.04.2014
Сообщений: 28,615
11.07.2018, 18:59 10
Цитата Сообщение от N0VY Посмотреть сообщение
при вводе строки на русском языке
А об этом написано в теме "русские шрифты".
0
11.07.2018, 18:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2018, 18:59
Помогаю со студенческими работами здесь

Битовые операции
Сдвинуть последовательность битов вправо так, чтобы на нулевой позиции находился первый единичный...

Битовые операции
Есть код signed int a = 10; a = !a; cout &lt;&lt; a; Выводит 0, объясните, почему??

Битовые операции
Здравствуйте, необходимо разбить двухбайтное целое число на тетрады и поменять местами 2 и 3...

битовые операции
как из 0001 0000 тоесть в dec '8' сделать 0000 0001 в dec '1'?


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru