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

cin И getline - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.76
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
10.04.2010, 23:08     cin И getline #1
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
Посмотрите здесь:

C++ getline(cin,a);
cin.getline() C++
C++ cin.getline
C++ cin.getline
C++ cin.getline
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
***GIN***
 Аватар для ***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++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.04.2010, 01:53     cin И getline #3
Krist_ALL, я бы порекомендовал использовать std::string для представления строк, раз уж ты используешь библиотеку STL.
***GIN***
 Аватар для ***GIN***
27 / 27 / 1
Регистрация: 09.04.2010
Сообщений: 60
11.04.2010, 03:33     cin И getline #4
К стати да - мешать Си и С++ в общем то можно, но уж как то неприлично
Krist_ALL
 Аватар для 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++
 Аватар для CyBOSSeR
2294 / 1664 / 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
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
11.04.2010, 15:35  [ТС]     cin И getline #7
тоесть в с++ чар не используется вообще?
а cin.getline
и getline(cin,
разные функции?
у них разные параметры..
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 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
 Аватар для 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++
 Аватар для CyBOSSeR
2294 / 1664 / 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
 Аватар для 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***
 Аватар для ***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
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
11.04.2010, 19:17  [ТС]     cin И getline #13
да!СПС. а если у меня string будет то cin.getline не подойдет какбтьы?

вообще есть смысл юзать чары?
или стринг намного удобнее и с чаром ток одна марока?
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
11.04.2010, 19:29     cin И getline #14
Мешать сишные потоки и сиплюсплюсовые, особенно учитывая, что поведение fflush для потоков ввода не определено - не лучшее занятие.
Как вариант - istream::ignore
Код
cin.ignore(numeric_limits<streamsize>::max(), '\n');
***GIN***
 Аватар для ***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.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2010, 00:33     cin И getline
Еще ссылки по теме:

getline(cin, str) и cin>> C++
cin.getline() C++
getline(cin, ); C++

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

Или воспользуйтесь поиском по форуму:
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
12.04.2010, 00:33     cin И getline #16
cin/cout/cerr по умолчанию синхронизированы с stdin/stdout/stderr, но в общем это можно отключить (ios_base::sync_with_stdio).
Как пропустить всё до конца строки, см. выше. Для очистки буфера istream::sync(). Про fflush(stdin) я уже сказал - undefined behaviour.
Description
2 If stream points to an output stream or an update stream in which the most recent
operation was not input, the fflush function causes any unwritten data for that stream
to be delivered to the host environment to be written to the file; otherwise, the behavior is
undefined
.
3 If stream is a null pointer, the fflush function performs this flushing action on all
streams for which the behavior is defined above.
Yandex
Объявления
12.04.2010, 00:33     cin И getline
Ответ Создать тему
Опции темы

Текущее время: 14:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru