Странно работает cin.get
Он почему-то не работает после того, как я делаю «cin >> чтототам», без этого все работает, а как только сделаю «cin >> чтототам», cin.get просто не работает 🙁 что делать ?
anonymous
05.05.01 12:46:38 MSD
Re: Странно работает cin.get
а можно подробности узнать, как именно не работает? желательно куском кода 🙂
anonymous
( 06.05.01 04:31:58 MSD )
Re: Странно работает cin.get
Куском кода давать проблематично т.к. я не умею делать переход на новую строку в этом форуме(пытался писать
— не получилось). Я пытаюсь делать примерно так : int age; char name[20]; Потом делаю cin >> age; Это работает и работает так как надо, а потом я делаю cin.get(name, 20); — вот это уже не работает, просто не делается приглашения ввести что-то. Похоже cin >> age; забирает все до пробела, а cin.get — подбирает все, что после него, а мне надо чтобы cin.get забирал свою, независимую от cin >> строку. Получилось сделать так, между cin >> и cin.get вставить char garbage; garbage = cin.get(); — так все нормально, но мне кажется как то неправильно это.
anonymous
( 06.05.01 17:24:21 MSD )
Re: Странно работает cin.get
не понял как не работает. у меня все работает:
int main(void) <
int age;
char name[20];
string str;
или я не понял чего именно ты хочешь?
заглотить целую строчку? тогда пользуй
istream& istream::getline(char* ptr, int len, char delim = ‘\n’);
соответственно cin.getline(name,20);
в общем пиши, разберемся 🙂
PS. а по поводу переносов, есть такой listbox под окошком,
ставишь там User line breaks 🙂
anonymous
( 07.05.01 00:42:53 MSD )
Re: Странно работает cin.get
Проверка
переноса
проверка
anonymous
( 07.05.01 00:54:54 MSD )
Re: Странно работает cin.get
Перенос работает — большое спасибо. Код не работает вот так:
#include
#include
age — он забирает, а вот fio — нет 🙁
anonymous
( 07.05.01 01:01:19 MSD )
Re: Странно работает cin.get
в общем мораль простая, cin >> age оставляет конец строки
в потоке, в результате по getline тебе прилетает пустая строчка
пока чтоб работало можешь сделать что-нить вроде:
#include
#include
void main(void) <
int age;
char fio[20],tmp;
cin >> age;
cin >> tmp;
cin.putback(tmp);
cin.getline(fio,20);
cout >
это работает, потому как все пробельные символы пропускаются пока
не найдется не-пробел, он кладется в tmp и потом запихивается
обратно в поток.
ну или если пустая строчка то перечитывай пока непустая не придет 🙂
хотя по-моему был какой-то прямой способ сказать
istream чтоб пропустил пробелы перед началом считывания.
утро вечера мудренее, завтра поковыряюсь — напишу
PS. подумай про случай, когда тебе введут `21 Joe Farmer’ 🙂
PPS. почему предпочитаешь char* использовать, когда есть string ?
anonymous
( 07.05.01 03:41:58 MSD )
Re: Странно работает cin.get
Спасибо, я в общем то так и делал, только чуть-чуть по другому:
char garbage;
garbage = cin.get();
cin.get без параметров возвращает единичный символ, похоже то что мне надо, тот самый разделитель, я потому и написал, что думал про другой способ, более правильный. Про тот случай когда вводятся данные целиком подумал, спасибо. String не использую потому, что сейчас пытаюсь разобраться с поизвольным доступом к файлу, записываю туда структуру целиком, и мне нужно чтобы были четкие размеры, а string я не вообще не особо понимаю — какие у него размеры 🙂 В общем большое спасибо, если найдешь другой способ — напиши пожалуйста.
anonymous
( 07.05.01 19:23:14 MSD )
Re: Странно работает cin.get
Структуру лучше записывать методом write, а считывать методом read. Пропускать пробелы — если я правильно помню — cin >> skipws.
justme ★
( 08.05.01 02:48:46 MSD )
Re: Странно работает cin.get
про структуры и бинарные файлы согласен с justme
про skipws все почти так, skipws в установленном сстоянии
обеспечивает пропуск пробельных символов при вводе(сам он их не извлекает)
перед данными при операциях вроде
cin >> age;
getline, get не пропускает пробелы перед вводом данных. отличаются
они тем, что getline забирает конец строчки из потока, а get — нет.
char garbage=cin.get();
работает только если после age не осталось пробелов до конца строки.
я-бы не стал на это надеяться, особенно если учесть возможность
перенаправления ввода из файла.
char tmp;
cin >> tmp;
cin.putback(tmp);
работает потому, что по-умолчанию в потоке стоит флажок skipws и все
пробелы пробелы пропускаются, в tmp кладется первый не пробел из следующей
строчки(fio), он запихивается обратно в поток и первый символ — начало
строчки. все работает, если устраивает игнорирование пробелов вначале fio.
и использовать примерно так:
char fio[20];
int age;
cin >> age;
skipwhite(cin);
cin.readline(fio,20);
или при большом желании можно сделать из нее манипулятор,
как писать пока не буду, надо будет — напишу 🙂
char fio[20];
int age;
cin >> age >> skipwhite;
cin.readline(fio,20);
надеюсь на этот раз ровно то, что хотелось 🙂
ds.
PS. DOS’овские CR/LF это, как обычно, дополнительные грабли, но имхо
лучше с ними не связаваться, а конвертить предварительно файлы.
PPS. все равно не пойму, чем тебе больше нравится
char fio[20];
cin.getline(fio,20);
чем
string fio;
cin.getline(fio);
по-моему ничем не хуже 🙂 а лучше,
а если структуры/бинарные данные вводить, то правильней использовать
read и write, они хоть char(0) в конец не добавляют, и читают
указанные 20 символов, а не 19, как get и getline 🙂
Почему getline не работает после cin c
т.е.определить p по некоторой формуле то все нормально работает.
Вопрос, как сделать так чтобы после ручнного ввода числа, cin.getline работал?
вся программа (шифрования цезаря с ключом) приведена ниже
cin. getline (q,2);
p=q[0]- ‘0’ ;
//определение позиции начала записи ключа
// for (i=0; i // // if (key[0]==Alfa[i])
// >
//записываем ключ в новый массив
for (i=p, j=0; i beta[i]=key[j];
>
//заполнение шифрованного масива остальными буквами после конца ключа
for (i=p+k, j=0; i for (z=0; z if (Alfa[j]==key[z])
beta[i]=Alfa[j];
>
//заполнение шифрованного массива перед началом ключа
for (i=0, j=j-1; i for (z=0; z if (Alfa[j]==key[z])
beta[i]=Alfa[j];
>
cin. getline (A,1000);
автор: shtirlitz (15.11.2008 в 11:59) письмо автору
проблема решена,
спасибо за внимание,
если у кого, такая же проблема, то перед строкой, где не срабатывает cin.getline
вставьте следующий код:
| cin. ignore (); |
и будет вам счастье!
автор: AlMag (15.11.2008 в 23:08) письмо автору
спасибо за информацю
автор: StarWorm (17.11.2008 в 03:07) письмо автору
Ого. Спасибо! 🙂
А то я недавно как раз долго не знал что и предпринять. Весь инет облазил, но так и не понял!
Проблема была в том, что после
| cin>>variable |
у меня не работала
| cin. getline (str,255) |
Хотя то же самое происходило и со
| scanf (. ) |
если после него было что то наподобие
| gets (. ) |
Но если их поменять местами, то все работало нормально.
Теперь все решено! Еще раз спасибо! xD RESPECT
Не работает cin.getline
Не работает cin.getline(name2, 3). Компилятор его тупо пропускает.
Добавлено через 4 минуты
первый cin.getline(name,3); работает нормально
Лучшие ответы ( 3 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

cin.getline как работает?
Здравствуйте, в моей программе я столкнулся с некоторой проблемой. В переменную place я хочу.

Не работает cin.getline(buf, 20);
Товарищи подскажите почему не работает cin.getline(buf, 20);? Проблема в том что я хочу ограничить.

Не работает. cin.getline(string,200);
Я создаю проект. Все работает кроме одного cin.getline(string,200), почему? Когда запускаю этот.
167 / 107 / 22
Регистрация: 02.01.2012
Сообщений: 596

Сообщение было отмечено FGlomgold как решение
Решение
Сообщение от FGlomgold 
Компилятор его тупо пропускает.
Нет. Просто после первого getline в буфере ввода остаётся символ конца строки, поэтому второй сразу завершается.
Попробуйте, например, ввести сразу 6 символов — и Вы увидете, что оба оператора отработали.
Почему после использования cin функции cin.get() и cin.getline() не работают, а последующие вызовы cin срабатывают?
Насколько я знаю cin оставляет символ ‘\n’ в потоке из-за чего последующие вызовы cin.get() и cin.getline() не будут срабатывать, поскольку они будут натыкаться на символ перевода строки и завершать свою работу. Для того, чтобы функции cin.get() и cin.getline() успешно работали после cin >> нужно «выбросить» ‘\n’ из потока при помощи cin.get() или cin.ignore(numeric_limits
Вопрос: почему cin будет работать и без «очищения» потока от символа ‘\n’?
Т.е. я имею в виду, что этот код будет работать без cin.get() или cin.ignore():
char str1[80], str2[80]; cin >> str1; cin >> str2;
А этот нет:
char str1[80], str2[80]; cin >> str1; cin.getline(str2, 80);