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

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

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

cin И getline - C++

10.04.2010, 23:08. Просмотров 5411. Ответов 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 символов оставляя в потоке все тсльаные если я к примеру ввел 'привет'
а потом хочу считать число.как мне очистить поток от мусора который оставила гтелайн?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2010, 23:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос cin И getline (C++):

Метод getline(cin, m) не срабатывает без cin.ignore() / Ревью кода - C++
Почему в моем случае getline(cin, m) не срабатывает без cin.ignore() ? Если по коду есть какие-нибудь замечания, то просьба написать что не...

Продемонстрировать различие между вводом с помощью cin.Get и cin.Getline с тремя параметрами - C++
Нужна помощь. Задача продемонстрировать различие между вводом с помощью cin.get и cin.getline с тремя параметрами, как из потока достать...

Отличие функции cin.get и cin.getline - C++
Добрый день! Изучаю функции get и getline, сказано, что они отличаются тем, что функция get считывает символ разрыва строк и оставляет...

Отличие getline() от cin.getline() - C++
Чем отличается getline() от cin.getline() ?

cin.getline и cin.ignore - C++
Есть кусок кода в котором не могу разобраться. Если cin.ignore() есть, то теряется первый вводимый символ начиная со второго входа в for....

getline(cin, str) и cin>> - C++
Добрый день. Есть код: ... string str; int N; cin&gt;&gt; N; getline(cin, str); cout&lt;&lt;str&lt;&lt;endl; //Выводит: &lt;пустота&gt; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
***GIN***
28 / 28 / 1
Регистрация: 09.04.2010
Сообщений: 60
11.04.2010, 01:51 #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; // Совсем уж для корректности
}
1
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.04.2010, 01:53 #3
Krist_ALL, я бы порекомендовал использовать std::string для представления строк, раз уж ты используешь библиотеку STL.
0
***GIN***
28 / 28 / 1
Регистрация: 09.04.2010
Сообщений: 60
11.04.2010, 03:33 #4
К стати да - мешать Си и С++ в общем то можно, но уж как то неприлично
1
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
11.04.2010, 13:15  [ТС] #5
1. Скажите что в моем коде от с?
2. Мемсет годится только для того наверно если я ввел при а гтелайн читает 5 симвоов - тогда да - полезная функция. А если я ввел 11 символов а гетлайн чиате только 5 ? ведь мемсет обнуляет только сколько я скажу а я же не знаю сколько пользователь введт букв. например я спрашиваю его имя а он ввел ааааааааааааааааааааааааааааааа а мне нада 5 символов первые выдернуть. гетлайном выдернул а остальное то осталось.
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.04.2010, 13:56 #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.
0
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
11.04.2010, 15:35  [ТС] #7
тоесть в с++ чар не используется вообще?
а cin.getline
и getline(cin,
разные функции?
у них разные параметры..
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.04.2010, 15:57 #8
Цитата Сообщение от Krist_ALL Посмотреть сообщение
тоесть в с++ чар не используется вообще?
Используется, std::string фактически просто инкапсулирует массив символов char.
Цитата Сообщение от Krist_ALL Посмотреть сообщение
а cin.getline
и getline(cin,
разные функции?
Естественно разные. Первая является методом класса istream. Вторая является обычной функцией.
Почитать про них можешь на MSDN или http://www.cplusplus.com/.
0
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
11.04.2010, 16:01  [ТС] #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;
ввожу первый раз приветабвгдежзик
втрой раз вводить не дает т.к. съедает что в буфере отсалось
как очишать буфер перед втоым вызовом гтелайн?
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.04.2010, 16:17 #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;
}
1
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
11.04.2010, 16:40  [ТС] #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>
выводит милый....
0
***GIN***
28 / 28 / 1
Регистрация: 09.04.2010
Сообщений: 60
11.04.2010, 18:20 #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;
}
То есть на ввод тебе пойдет абсолютно чистый поток, ты ведь это имел в веду если я правильно понял?
1
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
11.04.2010, 19:17  [ТС] #13
да!СПС. а если у меня string будет то cin.getline не подойдет какбтьы?

вообще есть смысл юзать чары?
или стринг намного удобнее и с чаром ток одна марока?
0
Somebody
2789 / 1603 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
11.04.2010, 19:29 #14
Мешать сишные потоки и сиплюсплюсовые, особенно учитывая, что поведение fflush для потоков ввода не определено - не лучшее занятие.
Как вариант - istream::ignore
Код
cin.ignore(numeric_limits<streamsize>::max(), '\n');
0
***GIN***
28 / 28 / 1
Регистрация: 09.04.2010
Сообщений: 60
11.04.2010, 21:06 #15
На сколько я помню cin, cerr, cout это как бы надстройка над stdin, stderr, stdout а сами же stdin... это дескрипторы устройств ввода, "ошибок", и вывода соответственно. Сбрасывая буфер Си'шной функцией fflush мы "очищаем" поток и соответственно С++ потоки ввода-вывода будут иметь доступ к абсолютно пустому потоку stdin, stdout или stderr.
По поводу того, что лучше char или string на самом деле сложно сказать. В первом случае ты имеешь уйму проблем при работе с цепочками символов, с выделением памяти под новые символы и т.д. Во втором у тебя не будет таких проблем но string работает несколько медленнее чем char. Я лично стараюсь char использовать когда требуется работа с одним байтом данных, либо с небольшой последовательностью символов. А если дело требует работы со строками то намного проще и удобнее работать со string.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2010, 21:06
Привет! Вот еще темы с ответами:

Cin вместо cin.getline - C++
#include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;fstream&gt; using namespace std; int get_int(int default_value); char name; ...

Не работает ни cin.Get(), ни cin.Getline() - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;conio.h&quot; #include &quot;windows.h&quot; #include &quot;string.h&quot; using namespace::std; const...

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

Getline() и cin - C++
Проблема заключается в том, что после ввода через cin , getline() не работает, точнее работает, но непонятно для меня. Я так предполагаю,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.04.2010, 21:06
Ответ Создать тему
Опции темы

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