Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемы с cin.getline()

6.8K
03 декабря 2006 года
Аццкий программер
91 / / 27.11.2006
Код:
static const int ML = 80;
...

void CMenu::Insertion()
{
    char nm[ML];
    memset (nm,0,ML);

    cout << "\nEnter name to add-> ";
    cin.getline ( nm, ML ) ;

    base.insertion(nm);
}

Проблема в том, что ввод nm "проскакивается" и в метод insertion() передается нулевой байт '\0'. Почему?
547
04 декабря 2006 года
Hydra
488 / / 20.06.2006
Попробуй перед этим что-нть типа
cin.flush()
6.8K
07 декабря 2006 года
Аццкий программер
91 / / 27.11.2006
cin.flush - нет такого метода у cin'а!
3
07 декабря 2006 года
Green
4.8K / / 20.01.2000
cin.flush - нет такого метода у cin'а!


Совсем недавно писал, как самому реализовать такую функцию:
http://forum.codenet.ru/showpost.php?p=157964&postcount=7

6.8K
11 декабря 2006 года
Аццкий программер
91 / / 27.11.2006
если кому интересно, я решил это проблему так:
Цитата:
scanf('%s', name);

3
11 декабря 2006 года
Green
4.8K / / 20.01.2000
Этож C-style.
Почему бы не сделать на C++ ?
 
Код:
string name;
cin >> name;
6.8K
11 декабря 2006 года
Аццкий программер
91 / / 27.11.2006
Цитата:
Этож C-style.


C-style, зато работает ;)

C C++ проблемка...

Цитата:
error C2679: binary '>>' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is no acceptable conversion)

3
11 декабря 2006 года
Green
4.8K / / 20.01.2000
У тебя с С++ не "проблемка", а ПРОБЛЕМА ;)
Обращаемся к учебникам, находим:
#include <string>
6.8K
11 декабря 2006 года
Аццкий программер
91 / / 27.11.2006
Цитата:
#include <string>


уже пробовал..

Цитата:
error C2664: 'SetName' : cannot convert parameter 1 from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' to 'char *' No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

3
12 декабря 2006 года
Green
4.8K / / 20.01.2000
Могу посоветовать только одно: УЧИ С++.
Возьми любую книгу для начинающих и вперед!
А то тыкаешься, как слепой котенок...

SetName.c_str();
6.8K
12 декабря 2006 года
Аццкий программер
91 / / 27.11.2006
2 Green
Зачем меня так опускать? Я, между прочим сам разобрался в своей ошибке..

до строки
cin.getline(name,N);
у меня в коде был ввод символьной переменной
...
char c;
cin >> c;
...
как оказалось при вводе целочисленных, вещественных и одиночных символов с помощью cin>> НЕ ДОЧИТЫВАЕТСЯ символ перевода строки '\n'. Таким образом он далее попадал ко мне в метод getline и принимался за ввод переменной name.

Другими словами, решение моей проблемы:
Цитата:

char c;
cin>> c;
cin.get();
cin.getline(name, N);

3
12 декабря 2006 года
Green
4.8K / / 20.01.2000
Ещё раз, почему бы не сделать по-человечески на C++ ?
 
Код:
char c;
cin>> c;

string name;
cin >> name;
6.8K
12 декабря 2006 года
Аццкий программер
91 / / 27.11.2006
код:
Цитата:

char c;
cin>> c;

string name;
cin >> name;


результат:

Цитата:
error C2664: 'SetName' : cannot convert parameter 1 from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' to 'char *' No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called



А это тебе чем не Си++???

Цитата:

char c;
cin>> c;
cin.get();
cin.getline(name, N);

3
12 декабря 2006 года
Green
4.8K / / 20.01.2000
код:
результат:


Это результат не приведенного кода, а того, что у тебя дальше.

Могу посоветовать только одно: УЧИ С++.
Возьми любую книгу для начинающих и вперед!

SetName.c_str();


А это тебе чем не Си++???


Тем, что это нелепо.

6.8K
14 декабря 2006 года
Аццкий программер
91 / / 27.11.2006
Цитата:
УЧИ С++


учу, учу...

Цитата:
Тем, что это нелепо.


Будь добр, объясни, каким местом это нелепо. Мне правда интересно.

Почему нелепо считывать getline'ом указатель на символьный массив(ака строка)?

char *name = new char[N];
cin.get();
cin.getline(name, N);

чем это хуже

string name;
cin >> name;

284
14 декабря 2006 года
michael_is_98
587 / / 25.02.2005
Вообще у меня с
string name;
cin>>name;
также не проходит, даже с c_str(). Так можно вообще делать, ведь c_str() возвращает указатель на константу,которую нельзя изменить. Или я не прав?
3
14 декабря 2006 года
Green
4.8K / / 20.01.2000

Будь добр, объясни, каким местом это нелепо. Мне правда интересно.

Почему нелепо считывать getline'ом указатель на символьный массив(ака строка)?

char *name = new char[N];
cin.get();
cin.getline(name, N);

чем это хуже

string name;
cin >> name;



1) в программе желательно избегать строк фиксированной дины,
2) в программе на С++ желательно избегать С-style,
3) cin.get(); - считывает один любой символ, в т.ч. не пробельный,
4) cin.getline - считывает всю строку до символа перехода на др. строку, т.о. в строку попадут и пробельные символы

Т.о. вполне возможно, что вместо имени "Вводимое_имя" ты получишь в результате " Вводимое_имя и другие слова, которые ввел пользователь с пробелами вначале".

5) ну и потом вариант с string name выглядит аккуратнее и читабельнее.

3
14 декабря 2006 года
Green
4.8K / / 20.01.2000
Цитата: michael_is_98
Вообще у меня с
string name;
cin>>name;
также не проходит, даже с c_str(). Так можно вообще делать, ведь c_str() возвращает указатель на константу,которую нельзя изменить. Или я не прав?



Да, c_str() возвращает указатель на константу.
Но если тебе что-то надо менять в строке, то проще работать именно со std::string, а не с C-string. Зачем тогда вообще вызывать c_str() ?

Вся проблема в том, что вы постоянно скатываетесь на C, вместо того, чтобы использовать возможности C++.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог