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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.76
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
#1

cin И getline - C++

10.04.2010, 23:08. Просмотров 5300. Ответов 15
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int main() {
 
using namespace std;
 
 
 
char n1[10];
int n2;
cout <<"n1 ";
cin.getline(n1,5);
cout <<"\nn2 ";
cin >> n2;
cout <<n1<<n2<<endl;
 
 
 
 
}
Гетлайн читает 5 символов оставляя в потоке все тсльаные если я к примеру ввел 'привет'
а потом хочу считать число.как мне очистить поток от мусора который оставила гтелайн?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2010, 23:08     cin И getline
Посмотрите здесь:

Пропускается cin.getline - C++
Здравствуйте. Функция поиска void search() { char str; int arr_1, arr_2,col_rezult = 0; int on_name = 0; int on_autor =...

Setlocal и cin.getline - C++
Привет Всем! У меня такая задачка. В начале программы setlocale(LC_ALL,&quot;rus&quot;) чтоб консоль русские буквы понимала, но по ходу программы мне...

cin.getline() не выполняется - C++
В коде ниже не выполняется cin.getline(), просто пропускает и начинает выполнять следующую строку (0.png то что получается). form z; //...

cin.getline скушал - C++
Вот ставлю чтоб ввёл 5 строк а даёт только 4, съедает 1 строку самую первую как это починить? char **s = new char* ; for(int i = 0; i...

Проблема с cin.getline(); - C++
Есть вопрос по поводу использования cin.getline() после cin: cin&gt;&gt; n; char c; cin.getline(c, buf); Почему можно ввести...

В чем отличия cin.getline от gets? - C++
Напрмер, записи gets(str) от cin.getline(str, 1000) что лучше использовать?

cin.getline() не читает строку - C++
Добрый день. Нужно последовательно ввести 2 строки через cin.getline(), но после ввода первой, если она превышает допустимый размер, ввод...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
***GIN***
27 / 27 / 1
Регистрация: 09.04.2010
Сообщений: 60
11.04.2010, 01:51     cin И getline #2
На самом деле мусор оставил ты. Ты ведь выделил память под 10 элементов типа char, а там в той памяти находится всякая кракозяба (случайные числа, части строк и т.д.), и ты ее чистить не стал, полагая, что кто то должен сделает это за тебя, и если я тебя правильно понял тут тебе просто стоит воспользоваться функцией memset, вот как твой пример тогда будет выглядеть:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
#define STR_SIZE 10
 
using namespace std;
 
 
int main()
{
char n1[STR_SIZE];
int n2;
cout <<"n1 ";
//мы пишем в память по адресу &n1 значения 0 третий параметр это размер в байтах сколько памяти 
//мы обнулим если так можно сказать :)
memset(&n1, 0, sizeof(char)*STR_SIZE);
cin.getline(n1,5);
cout <<"\nn2 ";
cin >> n2;
cout <<n1<<n2<<endl;
return 0; // Совсем уж для корректности
}
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.04.2010, 01:53     cin И getline #3
Krist_ALL, я бы порекомендовал использовать std::string для представления строк, раз уж ты используешь библиотеку STL.
***GIN***
27 / 27 / 1
Регистрация: 09.04.2010
Сообщений: 60
11.04.2010, 03:33     cin И getline #4
К стати да - мешать Си и С++ в общем то можно, но уж как то неприлично
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
11.04.2010, 13:15  [ТС]     cin И getline #5
1. Скажите что в моем коде от с?
2. Мемсет годится только для того наверно если я ввел при а гтелайн читает 5 симвоов - тогда да - полезная функция. А если я ввел 11 символов а гетлайн чиате только 5 ? ведь мемсет обнуляет только сколько я скажу а я же не знаю сколько пользователь введт букв. например я спрашиваю его имя а он ввел ааааааааааааааааааааааааааааааа а мне нада 5 символов первые выдернуть. гетлайном выдернул а остальное то осталось.
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.04.2010, 13:56     cin И getline #6
Цитата Сообщение от Krist_ALL Посмотреть сообщение
Скажите что в моем коде от с?
Я думаю ***GIN*** имел ввиду что ты используешь строки в стиле Си (char*).

Krist_ALL, просто со std::string работать гораздо удобнее.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
 
int main() {
  std::string n1;
 
  std::cout <<"n1 :";
  getline(std::cin, n1);
  
  int n2;
 
  std::cout <<"n2 :";
  std::cin >> n2;
 
  std::cout << n1 << n2 <<endl;
}
Считываешь строку полностью, а потом обрезаешь как тебе надо c помощью метода std::string erase.
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
11.04.2010, 15:35  [ТС]     cin И getline #7
тоесть в с++ чар не используется вообще?
а cin.getline
и getline(cin,
разные функции?
у них разные параметры..
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.04.2010, 15:57     cin И getline #8
Цитата Сообщение от Krist_ALL Посмотреть сообщение
тоесть в с++ чар не используется вообще?
Используется, std::string фактически просто инкапсулирует массив символов char.
Цитата Сообщение от Krist_ALL Посмотреть сообщение
а cin.getline
и getline(cin,
разные функции?
Естественно разные. Первая является методом класса istream. Вторая является обычной функцией.
Почитать про них можешь на MSDN или http://www.cplusplus.com/.
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
11.04.2010, 16:01  [ТС]     cin И getline #9
прочитал что если было передано больше знаков чем указано во втором параметре гетлайн то она съест т что будет в буфере

и второй раз она читает остаток.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
 
int main() {
using namespace std;
 
 
 
char a [10] = {'\0'};
char b [10] ={'\0'}
;
 
cin.getline(a,10);
cout <<endl<<"2 ";
cin.clear();
cin.getline(b,10);
cout <<a<<b;
ввожу первый раз приветабвгдежзик
втрой раз вводить не дает т.к. съедает что в буфере отсалось
как очишать буфер перед втоым вызовом гтелайн?
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.04.2010, 16:17     cin И getline #10
Krist_ALL, не заморачивайся, если тебе надо считать строку и урезать ее до пяти символов то вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
 
int main() {
  std::string str;
 
  std::getline(sdt::cin, str);
 
  const size_t str_size = 5;
 
  str.resize(str_size, '\0');
 
  std::cout << str << std::endl;
 
  return 0;
}
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
11.04.2010, 16:40  [ТС]     cin И getline #11
string name;
getline(cin,name);
cout <<name;

ввожу привет
жму enter и курсор перескакивает на другую строку ожидая ввода. ну ввожу еще что то.
на выходе привет.
что за второй ввод?

для string getline(cin,
для char cin.getline да?

Добавлено через 9 минут
C++
1
2
3
4
5
string name,name2;
getline(cin,name);
cout <<name<<endl;
getline(cin,name2);
cout <<name2<<endl;
пишу привет<enter>
милый<enter> //ПОЧЕМУ разад ввод требует???
выводит привет
ввожу котенок<enter>
выводит милый....
***GIN***
27 / 27 / 1
Регистрация: 09.04.2010
Сообщений: 60
11.04.2010, 18:20     cin И getline #12
Кажись догнал, что тебе нужно Попробуй сбросить содержимое потока функцией fflush(stdin);, вот предыдущий пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std; 
 
int main() 
{
    char a [10] = {'\0'};
    char b [10] ={'\0'};
 
    cin.getline(a,10);
    cout <<endl<<"2 ";
    cin.clear();
    fflush(stdin);
    cin.getline(b,10);
    cout <<a<<b;
    return 0;
}
То есть на ввод тебе пойдет абсолютно чистый поток, ты ведь это имел в веду если я правильно понял?
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
11.04.2010, 19:17  [ТС]     cin И getline #13
да!СПС. а если у меня string будет то cin.getline не подойдет какбтьы?

вообще есть смысл юзать чары?
или стринг намного удобнее и с чаром ток одна марока?
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
11.04.2010, 19:29     cin И getline #14
Мешать сишные потоки и сиплюсплюсовые, особенно учитывая, что поведение fflush для потоков ввода не определено - не лучшее занятие.
Как вариант - istream::ignore
Код
cin.ignore(numeric_limits<streamsize>::max(), '\n');
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2010, 21:06     cin И getline
Еще ссылки по теме:

Не работает cin.getline(buf, 20); - C++
Товарищи подскажите почему не работает cin.getline(buf, 20);? Проблема в том что я хочу ограничить ввод до 20 символов но оно не...

cin.getline - параметр int - C++
Доброго времени суток! Подскажите, пожалуйста, в чем дело. Я пытаюсь научиться программировать на C++ по самоучителю. Там написано,...

Интересное поведение cin.getline(); - C++
Доброго времени суток! Я не устаю терроризировать форум своими тупыми вопросами, но для этого он и создан. На этот раз у меня проблема с...

cin.getline пропуск ввода - C++
Стыдно 3 раз за сегодня обращаться по мелким проблемам, но увы, гугл не помогает. Сама проблема заключается вот в чем. В первом вводе,...

Error C2664 в cin.getline() - C++
Всем привет.Пишу телефонную книгу в консоли ,при попытке заполнить поля структуры вылазит ряд ошибок ,типа error C2664:...


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

Или воспользуйтесь поиском по форуму:
***GIN***
27 / 27 / 1
Регистрация: 09.04.2010
Сообщений: 60
11.04.2010, 21:06     cin И getline #15
На сколько я помню cin, cerr, cout это как бы надстройка над stdin, stderr, stdout а сами же stdin... это дескрипторы устройств ввода, "ошибок", и вывода соответственно. Сбрасывая буфер Си'шной функцией fflush мы "очищаем" поток и соответственно С++ потоки ввода-вывода будут иметь доступ к абсолютно пустому потоку stdin, stdout или stderr.
По поводу того, что лучше char или string на самом деле сложно сказать. В первом случае ты имеешь уйму проблем при работе с цепочками символов, с выделением памяти под новые символы и т.д. Во втором у тебя не будет таких проблем но string работает несколько медленнее чем char. Я лично стараюсь char использовать когда требуется работа с одним байтом данных, либо с небольшой последовательностью символов. А если дело требует работы со строками то намного проще и удобнее работать со string.
Yandex
Объявления
11.04.2010, 21:06     cin И getline
Ответ Создать тему
Опции темы

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