Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2018, 20:36   #1
Novy
Пользователь
 
Регистрация: 28.06.2018
Сообщений: 38
Вопрос Функция getline и битовые операции

Доброго времени суток всем, кто присуствует и кто не присуствует на Форуме! Написал программу, которая добавляет разные стили в введённый юзэром текст, используя 8 битов, под которые эти стили и выделены, но одна проблема: cin.getline как-то неправильно работает, например, вводя текст и нажимая Enter, ввод продолжается до тех пор, пока размер текста не пересечёт заданный лимит. Знаю, что дело в нуль-терминаторе, пробовал ставить в функцию \n вместо \0, но при написании размера массива и нажатии Enter пропускается ввод текста. Что делать?
Novy вне форума Ответить с цитированием
Старый 08.07.2018, 20:36   #2
Novy
Пользователь
 
Регистрация: 28.06.2018
Сообщений: 38
По умолчанию

Код:
#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);
}
Novy вне форума Ответить с цитированием
Старый 08.07.2018, 22:47   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Чо, ещё одна бесполезная задача? Цифры после точки в double пересчитал уже?
Лето на дворе, хорош дурью маяться, вали на ближайший водоём с пивом и бабами.

Пока есть время. Потом не будет.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 08.07.2018, 22:56   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Цифры после точки в double пересчитал уже?
Не путай, товарисч. ТС пересчитывал не цифры, а числа после точки Ну может у него конкурс на самую бесполезную прогу, и до подиума уже чуть-чуть
digitalis вне форума Ответить с цитированием
Старый 08.07.2018, 23:00   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
ТС пересчитывал не цифры, а числа после точки
Ах дадададада....
Сорри, отвлёкся.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 09.07.2018, 11:52   #6
Novy
Пользователь
 
Регистрация: 28.06.2018
Сообщений: 38
По умолчанию

Вместо Ваших фразочек помогите: этот Форум не для болтовни, а для помощи Всем, кому она нужна. Точки после запятых я решил временно оставить, думаю, сделаю эту задачку. Это тоже моё Д/З.

Повторяю вопрос: как мне использовать getline так, что-бы работал наверняка? Проблему подробнее расписал на самом вверху.

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Чо, ещё одна бесполезная задача? Цифры после точки в double пересчитал уже?
Лето на дворе, хорош дурью маяться, вали на ближайший водоём с пивом и бабами.

Пока есть время. Потом не будет.
Вам, гражданин, только пивасик да веселье, а? И так эмоций я нахватался после поражения России на матче Россия-Хорватия. Студенту, как я - не до Вашего пивасика.

Цитата:
Сообщение от digitalis Посмотреть сообщение
Не путай, товарисч. ТС пересчитывал не цифры, а числа после точки Ну может у него конкурс на самую бесполезную прогу, и до подиума уже чуть-чуть
Я перепутал ёпересете, задолбали уже. Цифр, а не чисел. И не будьте САМИ по себе бесполезны: помогите мне, сделайте этот день.

Последний раз редактировалось Аватар; 10.07.2018 в 19:56.
Novy вне форума Ответить с цитированием
Старый 09.07.2018, 16:19   #7
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Тут гр-ну Novy все что-то должны ? Платные репетиторы свой гонорар не отрабатывают ?
digitalis вне форума Ответить с цитированием
Старый 10.07.2018, 11:03   #8
Novy
Пользователь
 
Регистрация: 28.06.2018
Сообщений: 38
По умолчанию

Не должны, просто помогите. СРОЧНО. Мне правда это нужно сделать. Умоляю, помогите.

Как getline мне настроить так, что-бы при нажатии enter появлялся ввод текста вместо его пропускания?

Цитата:
Сообщение от digitalis Посмотреть сообщение
Тут гр-ну Novy все что-то должны ? Платные репетиторы свой гонорар не отрабатывают ?
Ну раз уж пришли сюда - не болтать же? Дуйте в Свободное Общение, если оно так Вам нужно, если нет - то будьте полезны и помогите.

Последний раз редактировалось Аватар; 10.07.2018 в 19:55.
Novy вне форума Ответить с цитированием
Старый 10.07.2018, 14:50   #9
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Помогаю.
1. Не надо лепить посты один за одним, добавления вносятся кнопкой ПРАВКА.
2. Учиться нужно систематически, а не аврально перед экзаменом.
Я на С++ не пишу, вот min@y™ - он точно поможет. Говорит: "Напишешь ему ответ, он сдаст, но таким же ##### и останется - меньше конкурентов "
А в какой раздел мне писа'ть - не будешь мне указывать, ладно? "Не говорите мне, что мне нужно делать, и я не скажу, куда вам нужно пойти "©
digitalis вне форума Ответить с цитированием
Старый 10.07.2018, 16:06   #10
Novy
Пользователь
 
Регистрация: 28.06.2018
Сообщений: 38
По умолчанию

А ВЫ почему "лепите" посты? Ну, моя ошибка, виноват, но Вы, взрослый человек, сами этого правила не прислушиваетесь. Кстати, мат даже с цензурой я всё равно помещу на рассмотрение модераторами. И min@y как-то не торопится помогать. А надо бы: курсовая на носу у меня. Это задание нужно срочно сделать, иначе меня не пустят на экзамен. Поэтому прошу помощи. Срочной. Всего ничего: что ставить в getline?! Или писать cin.getline? Если cin.getline, то что писать в нём?
Novy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Битовые операции(с++) Lazy maximka Помощь студентам 2 23.12.2010 18:55
Битовые операции _-Re@l-_ Свободное общение 12 11.07.2010 15:31
Битовые операции ("")(Э_Є)("") Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 04.07.2009 13:19
Битовые операции LEX.darnica Помощь студентам 14 23.12.2007 19:40