Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Letfly
0 / 0 / 0
Регистрация: 19.01.2011
Сообщений: 18
#1

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

07.02.2011, 20:24. Просмотров 1276. Ответов 10
Метки нет (Все метки)

Здравствуйте!
Если в самом начале в майне написать
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. Просто программа пролетает мимо.
Есть полный текст программы
0
Вложения
Тип файла: txt example.txt (12.7 Кб, 12 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2011, 20:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос cin странно себя ведет (C++):

Цикл While странно себя ведет - C++
Пишу программу которая считывает из каждой строки массив неизвестной длины.Цикл while(который помечен комментом) странно себя...

класс string. Программа странно себя ведет - C++
Программа странно себя ведет. После первого ввода имени и номера сотрудника, пропускает последующие вводы имен, переходя сразу к номеру. ...

Почему программа себя странно ведет: зацикливается после ввода значений? - C++
Зацикливается после воода значений. Подскажите пожалуйста в чем может быть проблема. #include <fstream> #include <iostream> ...

Как ведет себя cin, если пользователь вводит некорректные данные? - C++
Читаю C++ Primer Plus by Stephen Prata. В седьмой главе у него есть следующий пример. // lotto.cpp -- probability of winning ...

Работаю с файлом *.txt. Прога ведет себя странно если последняя строка файла пуста. Почему так? - C++
Добрый день! Помогите пожалуйста с небольшой проблемой. Что хотел сделать: Есть текстовый файл, в нем содержатся любые...

Програма неадекватно себя ведет - C++
Доброго время суток , помогите пожалуйста с кодом... Тут такое дело - програма запрашивает длинну и высоту стены( ширина 2 едигицы ) ...

10
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
07.02.2011, 20:28 #2
Letfly, cin.get() перед ним поставьте.
1
Letfly
0 / 0 / 0
Регистрация: 19.01.2011
Сообщений: 18
07.02.2011, 21:06  [ТС] #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() перед ним поставьте.
Все ок ,заработало. Спасибо!
0
asics
Freelance
Эксперт С++
2854 / 1789 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
07.02.2011, 21:06 #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;
0
Letfly
0 / 0 / 0
Регистрация: 19.01.2011
Сообщений: 18
07.02.2011, 23:11  [ТС] #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;
Результат:
вводим первую строку: первая строка
выводит: первая строка
вводим вторую : вторая строка
выводит: торая строка (первый символ зажеван)
0
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
07.02.2011, 23:13 #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
0
Letfly
0 / 0 / 0
Регистрация: 19.01.2011
Сообщений: 18
08.02.2011, 11:30  [ТС] #7
Да, есть такая функция...Возвращаемся к начальному вопросу:
В теле цикла функция getline(cin, s); опять игнорируется (никакой ошибки, просто игнор), cin.get() перед гетлайн спасает ситуацию, т.е. можно ввести строку, но только один раз. Во второй раз первый символ строки "зажевывается" (как понимаю, гет и зажевывает, но почему только во второй раз?)
Народ, неужели никто не сталкивался с подобным? Мне всего лишь нужно получить несколько "полных имен" в цикле.
0
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
08.02.2011, 14:22 #8
Letfly, А после getline()? Мне кажется так будет лучше.
0
panicwassano
594 / 562 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
08.02.2011, 15:38 #9
Letfly cin после себя оставляет '\n' в потоке, его нужно либо считать либо очистить поток
1
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
08.02.2011, 18:27 #10
Все. После cin вне цикла написать cin.get() первый раз после cin он считает '\n' и дальше будет читать нормально ибо дальше cin>> не используется
1
Letfly
0 / 0 / 0
Регистрация: 19.01.2011
Сообщений: 18
09.02.2011, 07:06  [ТС] #11
Всем спасибо. Разобрался))!!!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2011, 07:06
Привет! Вот еще темы с ответами:

Итератор по разному себя ведет в цикле - C++
Есть такой кусочек кода: string findKey (string key) { for (auto it = sectionList.begin(); it != sectionList.end(); it++) ...

Файловая система C++ некорректно себя ведет - C++
Файловая система C++ некорректно себя ведет. Считываю .bmp-файл в структуру (не во всю сразу), при выводе значений переменных из структуры...

Std::forward_list по-разному ведет себя с компиляторами gcc и vc++ - C++
Есть такой код: #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;forward_list&gt; using namespace std; void show(const...

Странно видёт себя программа - C++
Написал программу конвертор валют но при выборе валюты программа сразу пишет ответ. #include &lt;iostream&gt; using namespace std; int...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru