Форум программистов, компьютерный форум CyberForum.ru

cin странно себя ведет - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Letfly
0 / 0 / 0
Регистрация: 19.01.2011
Сообщений: 18
07.02.2011, 20:24     cin странно себя ведет #1
Здравствуйте!
Если в самом начале в майне написать
C++
1
2
char tch[32];
cin.getline(tch,32)
То все Ок, работает как надо.
Но в в мэйне есть еще while и в нем if
C++
1
2
3
4
5
6
7
8
9
10
11
 while(!quit)
    {
     ...
     ...
     if (nextBlock->GetState()==isNull)
        {
         cin.getline(tch,32);
         ...
         ...
         }
     }
Вообще никакой реакции на cin. Просто программа пролетает мимо.
Есть полный текст программы
Вложения
Тип файла: txt example.txt (12.7 Кб, 12 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.02.2011, 20:28     cin странно себя ведет #2
Letfly, cin.get() перед ним поставьте.
Letfly
0 / 0 / 0
Регистрация: 19.01.2011
Сообщений: 18
07.02.2011, 21:06  [ТС]     cin странно себя ведет #3
1.
Цитата Сообщение от ForEveR Посмотреть сообщение
Letfly, cin.get() перед ним поставьте.
сорри, не понял где поставить cin.get()

2.
Обратите внимание
Пишем:
C++
1
2
3
4
5
char tch[32];
cin.getline(tch,32);
cout<<tch<<endl;
cin.getline(tch,32)
cout<<tch<<endl;
Запускаем:
йцу йцу
йцу йцу
про про
про про
Т.е. все ОК.
Теперь пишем:

C++
1
2
3
4
5
char tch[32];
cin>>tch;
cout<<tch<<endl;
cin.getline(tch,32)
cout<<tch<<endl;
Тут getline просто игнорируется: Т.е гетлайн не работает после использования оператора >>?

Добавлено через 5 минут
Цитата Сообщение от ForEveR Посмотреть сообщение
Letfly, cin.get() перед ним поставьте.
Все ок ,заработало. Спасибо!
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
07.02.2011, 21:06     cin странно себя ведет #4
Letfly, Я так понимаю, надо очистить поток, попробуй так
C++
1
2
3
4
5
6
char tch[32];
cin>>tch;
cout<<tch<<endl;
cin.sync();
cin.getline(tch,32)
cout<<tch<<endl;
Letfly
0 / 0 / 0
Регистрация: 19.01.2011
Сообщений: 18
07.02.2011, 23:11  [ТС]     cin странно себя ведет #5
Блин, сколько у строк нюансов.
Сделал функцию считывания строки
C++
1
2
3
4
5
6
7
8
string getString(string * s, char * tch)
{
      cin.get()//по вышеописанному совету
      cin.getline(tch,32);
      *s=tch;
      cin.sync();//тоже по вышеописанному совету
      return * s;
}
Первый раз вызываю, работает нормально, при втором вызове(с другими параметрами) первый символ строки пропадает

C++
1
2
3
4
s=getString(&s, &tch[32]);
cout<<s<<endl;
s1=getString(&s1, &tch[32]);
cout<<s1<<endl;
Результат:
вводим первую строку: первая строка
выводит: первая строка
вводим вторую : вторая строка
выводит: торая строка (первый символ зажеван)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.02.2011, 23:13     cin странно себя ведет #6
Letfly, Мм... cin.sync() и cin.get() в одном флаконе не стоит делать
Но я вообще не понимаю что вы творите, если честно...

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <string>
#include <iostream>
 
using namespace std;
 
string getString(string * s, char * tch)
{
      cin.getline(tch,32);
      *s=tch;
      cin.sync();//тоже по вышеописанному совету
      return * s;
}
Если что есть функция getline перегруженная для типа string...
std::getline
Letfly
0 / 0 / 0
Регистрация: 19.01.2011
Сообщений: 18
08.02.2011, 11:30  [ТС]     cin странно себя ведет #7
Да, есть такая функция...Возвращаемся к начальному вопросу:
В теле цикла функция getline(cin, s); опять игнорируется (никакой ошибки, просто игнор), cin.get() перед гетлайн спасает ситуацию, т.е. можно ввести строку, но только один раз. Во второй раз первый символ строки "зажевывается" (как понимаю, гет и зажевывает, но почему только во второй раз?)
Народ, неужели никто не сталкивался с подобным? Мне всего лишь нужно получить несколько "полных имен" в цикле.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.02.2011, 14:22     cin странно себя ведет #8
Letfly, А после getline()? Мне кажется так будет лучше.
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
08.02.2011, 15:38     cin странно себя ведет #9
Letfly cin после себя оставляет '\n' в потоке, его нужно либо считать либо очистить поток
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.02.2011, 18:27     cin странно себя ведет #10
Все. После cin вне цикла написать cin.get() первый раз после cin он считает '\n' и дальше будет читать нормально ибо дальше cin>> не используется
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2011, 07:06     cin странно себя ведет
Еще ссылки по теме:

класс string. Программа странно себя ведет C++
Странно видёт себя программа C++
Почему программа себя странно ведет: зацикливается после ввода значений? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Letfly
0 / 0 / 0
Регистрация: 19.01.2011
Сообщений: 18
09.02.2011, 07:06  [ТС]     cin странно себя ведет #11
Всем спасибо. Разобрался))!!!
Yandex
Объявления
09.02.2011, 07:06     cin странно себя ведет
Ответ Создать тему
Опции темы

Текущее время: 01:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru