Проблемы с cin.getline()
...
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'. Почему?
cin.flush()
Совсем недавно писал, как самому реализовать такую функцию:
http://forum.codenet.ru/showpost.php?p=157964&postcount=7
Почему бы не сделать на C++ ?
cin >> name;
C-style, зато работает ;)
C C++ проблемка...
Обращаемся к учебникам, находим:
#include <string>
уже пробовал..
Возьми любую книгу для начинающих и вперед!
А то тыкаешься, как слепой котенок...
SetName.c_str();
Зачем меня так опускать? Я, между прочим сам разобрался в своей ошибке..
до строки
cin.getline(name,N);
у меня в коде был ввод символьной переменной
...
char c;
cin >> c;
...
как оказалось при вводе целочисленных, вещественных и одиночных символов с помощью cin>> НЕ ДОЧИТЫВАЕТСЯ символ перевода строки '\n'. Таким образом он далее попадал ко мне в метод getline и принимался за ввод переменной name.
Другими словами, решение моей проблемы:
char c;
cin>> c;
cin.get();
cin.getline(name, N);
cin>> c;
string name;
cin >> name;
char c;
cin>> c;
string name;
cin >> name;
результат:
А это тебе чем не Си++???
char c;
cin>> c;
cin.get();
cin.getline(name, N);
результат:
Это результат не приведенного кода, а того, что у тебя дальше.
Могу посоветовать только одно: УЧИ С++.
Возьми любую книгу для начинающих и вперед!
SetName.c_str();
А это тебе чем не Си++???
Тем, что это нелепо.
учу, учу...
Будь добр, объясни, каким местом это нелепо. Мне правда интересно.
Почему нелепо считывать getline'ом указатель на символьный массив(ака строка)?
char *name = new char[N];
cin.get();
cin.getline(name, N);
чем это хуже
string name;
cin >> name;
string name;
cin>>name;
также не проходит, даже с c_str(). Так можно вообще делать, ведь c_str() возвращает указатель на константу,которую нельзя изменить. Или я не прав?
Будь добр, объясни, каким местом это нелепо. Мне правда интересно.
Почему нелепо считывать 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 выглядит аккуратнее и читабельнее.
string name;
cin>>name;
также не проходит, даже с c_str(). Так можно вообще делать, ведь c_str() возвращает указатель на константу,которую нельзя изменить. Или я не прав?
Да, c_str() возвращает указатель на константу.
Но если тебе что-то надо менять в строке, то проще работать именно со std::string, а не с C-string. Зачем тогда вообще вызывать c_str() ?
Вся проблема в том, что вы постоянно скатываетесь на C, вместо того, чтобы использовать возможности C++.