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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2013, 00:02   #1
Erlotaza
Пользователь
 
Регистрация: 13.02.2012
Сообщений: 37
По умолчанию Не знаю как исправить ошибку считывания строки в структуре

С++ Привет. Есть структура, куда мы должны записать информацию про владельца, ФИО и номер телефона.. Если ввести > 1 слова в ФИО (через пробел, т.е: имя фамилия), то он номер уже не спросит а пропустит, но ПОТОМ, при выведении в поле номера num, выведет второе слово ФИО (то что после пробела
Нужно чтобы программа могла считывать несколько слов...
Заранее благодарен.
Код:
using namespace std;

struct owner
  {
  char FIO [19], num[9];
  }a[9];

int main ()
  {
  cout << "BBEDuTE KOJIu4ECTBO BJIADEJIbTCEB: "; int n; cin >> n;
  for (int i=0; i<n; i++)
   {
     cout << "\n BJIADEJIETC[" << i+1<<"]";
     cout << "\n FIO "; cin >> a[i].FIO;
     cout << " num "; cin >> a[i].num;
   }

   for (int i=0; i<n; i++)
   {
     cout << "\n BJIADEJIETC[" << i+1<<"]";
     cout << "\n FIO "; cout << a[i].FIO;
     cout << " num "; cout << a[i].num;
   }
}
вместо cin я пробовал cin.get(a[i].FIO) и gets(a[i].FIO) но выдало ошибку...
со string пробовал getline (cin, a[i].FIO) - тоже ошибка...
(P.S: я понимаю что cin считывает только 1 слово, но как исправить не знаю (

Последний раз редактировалось Erlotaza; 09.06.2013 в 00:28.
Erlotaza вне форума Ответить с цитированием
Старый 09.06.2013, 00:31   #2
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

На сколько я понимаю, Вам необходимо заполнить структуру указанным количеством записей (n). Т.е. если ввели 2 например, то вводим данные про 2-х владельцев. Я верно понимаю?
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 09.06.2013, 00:37   #3
Erlotaza
Пользователь
 
Регистрация: 13.02.2012
Сообщений: 37
По умолчанию

Да.
P.S: и чем gets отличается от cin.get ? Глянешь тут - так написано, там - по-другому..
Только что отдельно попробовал gets - работает, а в структуре - нет (
Код:
void main()
{
   char s[10];
   cout << "s=  ";
   gets(s);

   cout << "\n s=  " << s;
        getch();
}
Erlotaza вне форума Ответить с цитированием
Старый 09.06.2013, 00:46   #4
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Проверяйте.... Если есть вопросы по коду спрашивайте..
Код:
#include <iostream>
#include <cstdlib>

using namespace std;

struct owner
{
	char FIO[20];
	char number[12];
};

int main()
{
	int n = 0;
	
	system("chcp 1251 > nul");

	cout << "\n Введите количество записей: ";	cin >> n;

	owner *a = new owner[n];		// Выделение памяти под n записей
	cout << "\n Данные о владельцах.";
	for(int i = 0; i < n; i++)
	{
		cout << "\n Владелец №" << i+1 << endl;
		cout << " Ф.И.О.: ";	cin >> a[i].FIO;	
		cin.clear();				// Очистка потока
		cout << " Номер: ";	cin >> a[i].number;
	}
	delete []a;
	return 0;
}
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 09.06.2013 в 00:54.
Bugrimov вне форума Ответить с цитированием
Старый 09.06.2013, 01:27   #5
Erlotaza
Пользователь
 
Регистрация: 13.02.2012
Сообщений: 37
По умолчанию

Большое спасибо, но вопросов куча: )
Как научится чувствовать код? Мне очень туго лезет программирование, к сожалению (
Например, почему вы тут создали указатель? И теперь достаточно только CIN для считывания целой строки ! Почему cin.get или gets не работают также как сами по себе (без структуры).
2) Что означает
Код:
system("chcp 1251 > nul");
3)
Код:
cin.clear();				// Очистка потока
- непоянтно ( зачем? и как было бы без него? ну вообщем, в этом плане вообще 0..
4) delete []a; - это освобождение памяти из под указателя?
__
Спасибо
Erlotaza вне форума Ответить с цитированием
Старый 09.06.2013, 07:50   #6
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

1. Изначально вы вводите количество владельцев, но сколько нужно выделить памяти под этот массив структур???. Я объявляю указатель на структуру и при помощи
Код:
new
отмеряю нужный мне кусок памяти для хранения всех моих записей. (блок для хранения массива структур). Открою секрет cin.get и gets работают сами по себе и без структур.... Это 2 способа организации ввода данных. В первом случае используется метод get класса cin, а во втором случае функция из стандартной библиотеке gets().
2.
Код:
system("chcp 1251 > nul");
- руссифицирует текст в консоли.
3.
Код:
cin.clear();
выполняет очистку потока. Для ввода данных используется поток ввода (да и вообще все взаимодействия с файлами, с экраном, с клавиатурой осуществляются через потоки). Так вот для корректного ввода строки number предварительно очищаем поток. Без очистки потока программа не предлагала бы вводить number в структуру Вот такие страхи....
4. Так же при динамическом выделении памяти ее необходимо обязательно освободить. Это мы осуществляем при помощи delete.

В общих чертах так...

Кстати добавим вывод введенных данных
Код:
cout << "\n Вывод данных:\n ------------------" << endl;
for(int i = 0; i < n; i++)
	cout << " " << i+1 << " " << a[i].FIO << " " << a[i].number << endl;
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 09.06.2013 в 07:58.
Bugrimov вне форума Ответить с цитированием
Старый 09.06.2013, 15:31   #7
Erlotaza
Пользователь
 
Регистрация: 13.02.2012
Сообщений: 37
По умолчанию

Огромное спасибо за разъяснения ))
Но код всё равно не работает корректно (
(если ввести 2 слова в ФИО, то номер не спросит)
P.S: способ русификации как и предыдущие которые я пробовал, не действует (в консоли иероглифы) / Borland C++ Builder 6
Erlotaza вне форума Ответить с цитированием
Старый 09.06.2013, 16:55   #8
revizor
Форумчанин
 
Аватар для revizor
 
Регистрация: 20.01.2013
Сообщений: 146
По умолчанию

Цитата:
если ввести 2 слова в ФИО, то номер не спросит
попробуй таким способом:

Код:
cout << "Данные о владельцах." << endl;
for (int i=0; i<n; ++i)
{
	cin.get();
	cout << "Владелец №" << (i+1) << endl;
	cout << "  Ф.И.О.: ";  cin.get(a[i].fio, 20);
	cin.get();
	cout << "  Номер: ";  cin >> a[i].number;
}
revizor вне форума Ответить с цитированием
Старый 09.06.2013, 21:16   #9
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Справедливо... Извините за невнимательность, поторопился
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 10.06.2013, 18:52   #10
Erlotaza
Пользователь
 
Регистрация: 13.02.2012
Сообщений: 37
По умолчанию

revizor, спасибо. Попробовал ваш вариант, ошибка:
Код:
[C++ Error] Unit1.cpp(33): E2285 Could not find a match for 'istream::get(string,int)'
ПРОБЛЕМА РЕШЕНА: знакомый помог Со string правильно было всё, нужно было только 1 строку дописать
"очистить поток" - cin.ignore();
Код:
#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
#include <iostream>
#include <string>

using namespace std;
 
struct Owner {
        string name, car_num;
        int tel, tech_num;
};

void rr (string name, int tel) {
     zzcout << "Your input:\n";

                cout << ")) BJIACHuK\n";
                cout << "name: " << name << endl;
                cout << "tel: " << tel << endl;
                ;
}

void main()
{
        int n;
        cout << "BBEDITb KIJIbKICTb BJIACHuKIB ABTO: ";
        cin >> n;
        Owner *owners = new Owner[n];
 
        cout << "\nBBEDITb info npo BJIACHuKIB\n";
        cout << "-----------------------\n";
 
        for (int i = 0; i < n; i++) {
                cout << "BJIACHuK [" << i+1 << "] name: ";
                cin.ignore();
                getline(cin,owners[i].name);
                cout << "BJIACHuK [" << i+1 << "] car_num: ";
                cin >>  owners[i].car_num;
                cout << "BJIACHuK [" << i+1 << "] tel: ";
                cin >> owners[i].tel;
                cout << endl;
        }

        for (int i = 0; i < n; i++) {
              rr (owners[i].name, owners[i].tel);
        }
 
        cin.get();
        cin.get();
}
Erlotaza вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не знаю как исправить некоторые баги Льолик Общие вопросы C/C++ 2 24.03.2012 01:09
не знаю как исправить ошибку Katrina* Паскаль, Turbo Pascal, PascalABC.NET 2 22.12.2011 09:55
Не могу найти ошибку... хотя я ее нашел... но не знаю как исправить))) ( удаление строки из файла) dykatob Общие вопросы C/C++ 0 03.06.2011 10:42
Допущена ошибка,не знаю как исправить sSilen Помощь студентам 8 08.01.2011 20:56
Задача на строки...помогите исправить ошибку Ker_33rus Общие вопросы C/C++ 9 05.12.2009 14:12