Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с cin 
V
    Опции темы
yngwie19
Дата 6.10.2008, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Всем привет. помогите с кодом:
Код

#include <iostream.h>

int main()
{

    char one[4];
    char two[4];
    char three[5];
    
    cin.ignore();
    cin.getline(one,4);
    cin.ignore(2);
    cin.getline(two,4);
    cin.ignore();
    cin.getline(three,5);
    
    cout<<one<<two<<three<<endl;
    
    return 0;


Вопрос:
1) Скажите все шесть объектов cin работают в связке? т.е все они воспринимаются как один да?
2)  Почему если ввесли такой текст: (812) - 123-456, то на печать выйдет полько 812 ? что не так.
3) Когда срабатывает cin.getline(one,4) , то он беоет из потока только 3 символа и один оставляет для '\0' так?

ВСЕМ СПАСИБО.
PM MAIL   Вверх
jonie
Дата 7.10.2008, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата

1) Скажите все шесть объектов cin работают в связке? т.е все они воспринимаются как один да?
cin это и есть ОДИН объект.

Цитата

2)  Почему если ввесли такой текст: (812) - 123-456, то на печать выйдет полько 812 ? что не так.
потому что вы используеие getline(char*, 4). взято будет 4 символа, '(' будет игнорирован.
getline будет "отрабатывать" после нажатия на enter,а не по окончании ввода трех символов.

Цитата

3) Когда срабатывает cin.getline(one,4) , то он беоет из потока только 3 символа и один оставляет для '\0' так?
не оставляет, а записывает в one[3] = '\0', если было введено 3 и более символов (лишние символы будут "обрезаны", конечно же).


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
yngwie19
Дата 7.10.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



[QUOTE=jonie,7.10.2008,  00:07]
Цитата

1) Скажите все шесть объектов cin работают в связке? т.е все они воспринимаются как один да?
cin это и есть ОДИН объект.

прошу прощения. Я имел ввиду все вызовы функций объекта cin, работают в связке? Объясните пожалуйста как это работает

Задание такое ввести номер телефона в формате (812) 123-789, чтобы после присваивания соответствующим массивам групп цифр, на печать вышло 812123789.

Это сообщение отредактировал(а) yngwie19 - 7.10.2008, 14:54
PM MAIL   Вверх
yngwie19
Дата 7.10.2008, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



кто-нибудь подскажите, очень хочу разобраться
PM MAIL   Вверх
J0ker
Дата 8.10.2008, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



cin - объект, экземпляр класса istream (basic_istream специализированный char'ом)
он присоединен к потоку ввода - поэтому он один
все операции с ним естественно связаны, т.к. любая операция может изменить его состояние.
getline извлекает всю строку
замените на get(...

когда getline извлекает count-1 элемент, тогда она выставляет fail бит и все последующие операции вываливаются с fail
поэтому после каждого извлечения надо сбрасывать этот флаг:
Код

#include <iostream.h>
int main()
{
    char one[4];
    char two[4];
    char three[5];
    
    cin.ignore();
    cin.getline(one,4);
    cin.clear();
    cin.ignore(2);
    cin.getline(two,4);
    cin.clear();
    cin.ignore();
    cin.getline(three,5);
    cin.clear();
    cout<<one<<two<<three<<endl;
    
    return 0;


а вообще - как-то криво привязываться к формату посредством подсчета символов...

Это сообщение отредактировал(а) J0ker - 8.10.2008, 02:04


--------------------
user posted image
PM MAIL   Вверх
yngwie19
Дата 8.10.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Joker, спасибо, все работает.
Объясни мне пожалуйста. Все вызовы функций объекта cin, работают в связке? (т.е при запуске программы предлягается сразу ввести строку за один раз, а уж они ее обработают и запишут в соответствующие масиивы) Я правильно это понимаю?

PM MAIL   Вверх
J0ker
Дата 8.10.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(yngwie19 @  8.10.2008,  10:41 Найти цитируемый пост)
Объясни мне пожалуйста. Все вызовы функций объекта cin, работают в связке? 

я не совсем понимаю что значит "в связке"

Цитата(yngwie19 @  8.10.2008,  10:41 Найти цитируемый пост)
т.е при запуске программы предлягается сразу ввести строку за один раз, а уж они ее обработают и запишут в соответствующие масиивы

да
первый вызов cin.ignore() останавливает программу и ожидает ввода строки. Как только строка введена с завершающим enter ( \n(\r) ) - начинается обработка строки. В твоем случае лучше все getline кроме последнего заменить на get - getline извлекает из потока конец строки (\n) если он встретится. Т.о. если ты введешь строку короче, то очередной getline извлечет конец строки и последующая операция извлечения снова остановит выполнение до ввода новой строки. Так что лучший вариант такой:
Код

#include <iostream.h>
int main()
{
    char one[4];
    char two[4];
    char three[5];
    
    cin.ignore();
    cin.get(one,4);
    cin.ignore(2);
    cin.get(two,4);
    cin.ignore();
    cin.getline(three,5);
    cin.clear();
    cout<<one<<two<<three<<endl;
    
    return 0;
}



--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.