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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2019, 17:49   #1
LomionDK
Пользователь
 
Регистрация: 24.02.2019
Сообщений: 33
По умолчанию Чтение строки

Есть часть кода.
struct Comp {
int n;
int id;
struct game {
char game[20];
string type;
}igra[10];
}comp[100];
В главной функции след.
cout << "Введите название игры: ";
cin >> comp[kolComp].igra[comp[kolComp].n].game;
cout << "Введите тип игры: ";
cin >> comp[kolComp].igra[comp[kolComp].n].type;

Так вот. При вводе, считывает не 20 символов, как надо, а все, что ввожу. Через getline пробовал, но возникает другая ошибка. Через gets_s вообще скипает ввод. А мне и пробелы вводить надо.
LomionDK вне форума Ответить с цитированием
Старый 18.03.2019, 17:58   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от LomionDK Посмотреть сообщение
При вводе, считывает не 20 символов, как надо, а все, что ввожу.
До разделителя, дефолтно пробел.

Цитата:
Сообщение от LomionDK Посмотреть сообщение
Через getline пробовал, но возникает другая ошибка.
Ей нужен стринг, а так ошибок быть не должно. Это стандартный вариант.

Цитата:
Сообщение от LomionDK Посмотреть сообщение
Через gets_s вообще скипает ввод.
Хватит мешать С и С++. Если так хочется, то используйте std::cin.get(s, 20)
p51x на форуме Ответить с цитированием
Старый 18.03.2019, 18:05   #3
LomionDK
Пользователь
 
Регистрация: 24.02.2019
Сообщений: 33
По умолчанию

В том и проблема. При использовании всего, кроме cin. Ввод скипается. Может быть проблема в структуре?
LomionDK вне форума Ответить с цитированием
Старый 18.03.2019, 18:07   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

У меня не скипается. Показывайте больше кода.
p51x на форуме Ответить с цитированием
Старый 18.03.2019, 18:22   #5
LomionDK
Пользователь
 
Регистрация: 24.02.2019
Сообщений: 33
По умолчанию

...

Последний раз редактировалось LomionDK; 18.03.2019 в 18:43.
LomionDK вне форума Ответить с цитированием
Старый 18.03.2019, 18:42   #6
LomionDK
Пользователь
 
Регистрация: 24.02.2019
Сообщений: 33
По умолчанию

Код:
#include <iostream>
#include <string>
#include <cstring>
#include <windows.h>
using namespace std;
int kolComp = 0;
void menu();
struct Comp {
	int n;
	int id;
	struct game {
		char game[20];
		string type;
	}igra[10];
}comp[100];
int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	system("cls");
	menu();
}
void menu1() {
	int point;
	cin >> point;
	if (point == 1) {
		system("cls");
		comp[kolComp].n++;
		cout << "Введите название игры: ";
		cin >> comp[kolComp].igra[comp[kolComp].n].game;
		cout << "Введите тип игры: ";
		cin >> comp[kolComp].igra[comp[kolComp].n].type;
		menu1();
	}
	else {
		kolComp++;
		menu();
	}
}
void menu() {
	int pointer;
	cin >> pointer;
	if (pointer == 1) {
		system("cls");
		cout << "Введите название игры: ";
		cin.get(comp[kolComp].igra[comp[kolComp].n].game, 20);
		cout << "Введите тип игры: ";
		cin >> comp[kolComp].igra[comp[kolComp].n].type;
		menu1();
	}
}
Вот тут скипается при выборе 1.
_____
Код программы нужно выделять (форматировать) тегами [CODE] [/CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 18.03.2019 в 18:45.
LomionDK вне форума Ответить с цитированием
Старый 18.03.2019, 19:43   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Вставьте перед cin.get cin.ignore(numeric_limits<streamsiz e>::max(), '\n'); и не будет скипаться. Как и предполагал - вы перевод строки в буфере оставляете.

P.S. Телепатируя: перед инклудом виндовс.х задефайните NOMINMAX.
p51x на форуме Ответить с цитированием
Старый 18.03.2019, 19:58   #8
LomionDK
Пользователь
 
Регистрация: 24.02.2019
Сообщений: 33
По умолчанию

Такой вопрос. Когда ввожу уже 20+символов, то из названия остаток переносится в тип игры. Как сделать, чтобы просто обрезалось, а тип сам вводил в таком случае?
LomionDK вне форума Ответить с цитированием
Старый 18.03.2019, 20:10   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Перечитайте пост выше
p51x на форуме Ответить с цитированием
Старый 18.03.2019, 21:16   #10
LomionDK
Пользователь
 
Регистрация: 24.02.2019
Сообщений: 33
По умолчанию

Теперь, cin.get считывает даже пустой ввод. Как поставить фильтр для пустой строки? Через if(x=="\0")?
LomionDK вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение строки Praud Общие вопросы C/C++ 5 01.12.2012 20:42
Чтение строки с пробелами phpcreator Помощь студентам 5 15.10.2009 18:13
Чтение функции из строки? StakanpORTvejna Общие вопросы Delphi 4 28.04.2009 17:21
Чтение строки limon Помощь студентам 3 08.09.2008 14:36
Чтение строки... prizrak1390 Общие вопросы Delphi 2 28.02.2008 11:18