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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> cin.clear не очищает поток, cin.clear и getline не работают вместе 
:(
    Опции темы
dimbas
Дата 21.6.2009, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нужно ввести с клавиатуры строку из 5 символов. если их больше - повторить запрос.
Код такой:

Код

#include <iostream>
using namespace std;

int main()
{
  char s[7];

  do
  {
    cin.clear();
    cout << "enter string:" << endl;
    cin.getline(s, 7);
  }
  while (strlen(s)>5);

  cout << s << endl;

  return 0;
}


Если вводишь 5 или меньше - все в порядке.
Если вводишь 6 - тоже все хорошо, запрос повторяется.
А если 7 или больше - то поток не чистится, и символы начиная с 7-го в следующей итерации считываются сами (то есть они в потоке остались), и цикл завершается.

Подскажите, что не так

Это сообщение отредактировал(а) dimbas - 21.6.2009, 18:22
PM MAIL ICQ   Вверх
azesmcar
Дата 21.6.2009, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(dimbas @  21.6.2009,  18:21 Найти цитируемый пост)
Нужно ввести с клавиатуры строку из 5 символов. если их больше - повторить запрос.

Код

#include <iostream>
#include <string>

int main()
{
    std::string line;
    do
    {
        std::cout << "enter string: ";
        getline(std::cin, line);
    } while (line.size() != 5);
    std::cout << "ok..." << std::endl;
}

PM   Вверх
dimbas
Дата 21.6.2009, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо.
А можно ли все-таки с char'ом?
PM MAIL ICQ   Вверх
azesmcar
Дата 21.6.2009, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Код

#include <iostream>
#include <string>

int main()
{
    char line[10];
    do
    {
        std::cout << "enter string: ";
        std::cin.getline(line, '\n');
    } while (strlen(line) != 5);
    std::cout << "ok..." << std::endl;
}

PM   Вверх
dimbas
Дата 21.6.2009, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



дело в том, что нужно предусмотреть и случаи, когда юзер введет, в данном случае, больше 10 символов.
PM MAIL ICQ   Вверх
azesmcar
Дата 21.6.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(dimbas @  21.6.2009,  19:19 Найти цитируемый пост)
дело в том, что нужно предусмотреть и случаи, когда юзер введет, в данном случае, больше 10 символов. 

Вы хоть сами понимаете чего хотите? В первом варианте это предусмотрено было, вы захотели через char массив. Определитесь сперва с задачей.

Это сообщение отредактировал(а) azesmcar - 21.6.2009, 19:24
PM   Вверх
dimbas
Дата 21.6.2009, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Строка должна быть максимум из пяти символов. Если вводится от одного до пяти символов, то все хорошо.
Если же ведено 6 или более символов, то требуется повторить ввод. То есть нельзя написать line[10] или даже line[255])).

В принципе, ваш код со стрингами подходит, если нельзя чарами (или сложно), то забейте)
PM MAIL ICQ   Вверх
azesmcar
Дата 21.6.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(dimbas @  21.6.2009,  19:28 Найти цитируемый пост)
В принципе, ваш код со стрингами подходит, если нельзя чарами (или сложно), то забейте) 

А чем вас std::string не устраивает? Вам заранее неизвестно сколько введет пользователь, какого размера массив создать?
PM   Вверх
dimbas
Дата 21.6.2009, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Допустим, задание: использовать массив char.
Вот я и выделял 7: 5+1 для '\0', и еще один, чтобы при условии while (strlen(s)>5) остаться в цикле
PM MAIL ICQ   Вверх
AnLun
Дата 21.6.2009, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



to dimbas: Вам память жалко, больше массив создать?
PM MAIL   Вверх
dimbas
Дата 21.6.2009, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Понимаете, задание такое smile 
PM MAIL ICQ   Вверх
kosmonaFFFt
Дата 21.6.2009, 20:29 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Задание использовать как можно меньше памяти? )
Я например если приходится char * юзать, сразу про запас 4096
длину строки делаю...


--------------------
user posted image
PM MAIL ICQ   Вверх
zim22
Дата 21.6.2009, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(kosmonaFFFt @  21.6.2009,  20:29 Найти цитируемый пост)
Я например если приходится char * юзать, сразу про запас 4096длину строки делаю...

бомбу замедленного действия создаёте? smile


--------------------
PM MAIL   Вверх
dimbas
Дата 21.6.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(kosmonaFFFt @  21.6.2009,  20:29 Найти цитируемый пост)
Задание использовать как можно меньше памяти? )

можно и так сказать. то есть не выделять лишнего
PM MAIL ICQ   Вверх
ViruZZ
Дата 21.6.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



to azesmcar: Если в Вашем коде перед циклом поставить какой либо ввод, к примеру
Код

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string line;
    int n;
    cout << "Enter n" << endl;
    cin >> n;
    do
    {
        cout << "enter string: ";
        getline(cin, line);
    } while (line.size() != 5);
    cout << "ok..." << endl;
}
 

то getline захватывает предыдущий enter:
"
    Enter n
    1
    enter string: enter string:
"
Каким образом можно очистить поток в этом случае??
В принципе, в теме спрашивалось об очищении потока, чего в Вашем коде не увидел)

Это сообщение отредактировал(а) ViruZZ - 21.6.2009, 20:56
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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