Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 47, средняя оценка - 4.85
AlexH
0 / 0 / 0
Регистрация: 02.09.2011
Сообщений: 4
#1

std::cin - C++

02.09.2011, 21:06. Просмотров 7584. Ответов 12
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
const int MAX = 256;   
int main()
{
 char buf[MAX]; 
 std::cout<<(std::cin>>buf);
 return 0;
}
Я в консоли вижу странный вывод и не пойму что это есть такое? Что возвращает выражение скобках?
Где найти детальную информацию про работу с объектом cin?

C++
1
2
3
4
5
6
7
const int MAX = 256;   
int main()
{
 char buf[MAX]; 
 while (std::cin>>buf) std::cout<<buf<<std::endl;
 return 0;
}
Почему если в данном случае ввести строку "a b c d" тело выполнится 4 раза, и я получу на выходе
a
b
c
d
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2011, 21:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос std::cin (C++):

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил...

Не работает std::cout || std::cin
#include &quot;Account.h&quot; #include &lt;string&gt; #include &lt;iostream&gt; using...

Из scanf в std::cin
Как тоже самое сделать с помощью std::cin? printf(&quot;Введите автора %d...

Очистка (блокировка) std::cin
Здравствуйте. Такой вопрос. Программа отрисовывает в консоль поле раз в n...

Как работает cin.peek, cin,get, cin.ignore, cin.clear?
Здравствуйте, товарищи и не товарищи!:) Я только начал изучать C++, а уже...

Как выполнять std::cin в LOOP ?
Хочу сделать что то вроде командной строки. 1ый раз читает и выполняет...

12
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
02.09.2011, 21:08 #2
Цитата Сообщение от AlexH Посмотреть сообщение
Код C++1
2
3
4
5
6
7 const int MAX = 256;
int main()
{
char buf[MAX];
while (std::cin>>buf) std::cout<<buf<<std::endl;
return 0;
}
Почему если в данном случае ввести строку "a b c d" тело выполнится 4 раза, и я получу на выходе
a
b
c
d
Спасибо.
cin считывает до разделителя - /n /t и т.д.
0
Сыроежка
Заблокирован
02.09.2011, 21:13 #3
Цитата Сообщение от AlexH Посмотреть сообщение
C++
1
2
3
4
5
6
7
const int MAX = 256;   
int main()
{
 char buf[MAX]; 
 std::cout<<(std::cin>>buf);
 return 0;
}
Я в консоли вижу странный вывод и не пойму что это есть такое? Что возвращает выражение скобках?
Где найти детальную информацию про работу с объектом cin?

C++
1
2
3
4
5
6
7
const int MAX = 256;   
int main()
{
 char buf[MAX]; 
 while (std::cin>>buf) std::cout<<buf<<std::endl;
 return 0;
}
Почему если в данном случае ввести строку "a b c d" тело выполнится 4 раза, и я получу на выходе
a
b
c
d
Спасибо.
Все очень просто. Первое считывание std::cin>>buf считывает символ 'a'. То есть считывает до разделяющего пробела. Затем выполняется предложение цикла std::cout<<buf<<std::endl;, которое печатает этот символ и символ конца строки, задаваемый с помощью std::endl;
Затем итерация цикла продолжается, и считывается символ 'b', с которым происходят такие же действия. И т.д.
0
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
02.09.2011, 21:15 #4
.........
0
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 2
Завершенные тесты: 1
02.09.2011, 21:23 #5
C++
1
while (std::cin>>buf)
Тут на самом деле будет вызван operator void*(std::istream const&) (сигнатура примерная), а тип void* в свою очередь будет приведен к bool для проверки условия цикла. Значение true/false будет зависить от состояния потока (т.е. от флагов eofbit, failbit, badbit и goodbit), при любом выставленном флаге, отличном от goodbit, будет возвращенно false, в противном случае true.

А тут:
C++
1
std::cout<<(std::cin>>buf)
будет вызван std::istream& operator>>(std::istream&, char*), т.е. оператор вернет ссылку на поток ввода, который ты пробуешь вывести в поток вывода, отсюда и бред в output (странно, что это вообще компилируется).
1
AlexH
0 / 0 / 0
Регистрация: 02.09.2011
Сообщений: 4
02.09.2011, 21:27  [ТС] #6
Kastaneda,
Спасибо, где про это можно почитать подробней?
0
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 2
Завершенные тесты: 1
02.09.2011, 21:29 #7
Цитата Сообщение от AlexH Посмотреть сообщение
Спасибо! а как быть со значением выражения, стоящего внутри while, какие значения оно принимает в этом случае?
Я же выше написал)
Если считывание из потока прошло успешно, то будет выставлен флаг goodbit, и выражение примет значение true. А если при считывании возникли "проблемы" (достигнут конец фала (или символа '\n' в случае с std::cin), неверное значение в потоке и т.д.), то будет выставленн соответствующий флаг, и выражение примет значение false, в этом случае цикл while() перестанет выполнятся.
1
AlexH
0 / 0 / 0
Регистрация: 02.09.2011
Сообщений: 4
02.09.2011, 21:31  [ТС] #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
Я же выше написал)
Если считывание из потока прошло успешно, то будет выставлен флаг goodbit, и выражение примет значение true. А если при считывании возникли "проблемы" (достигнут конец фала (или символа '\n' в случае с std::cin), неверное значение в потоке и т.д.), то будет выставленн соответствующий флаг, и выражение примет значение false, в этом случае цикл while() перестанет выполнятся.
Не успел обновить, сорри.
0
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 2
Завершенные тесты: 1
02.09.2011, 21:31 #9
Цитата Сообщение от AlexH Посмотреть сообщение
Спасибо, где про это можно почитать подробней?
Ну очевидно в любой вменяемой книге по С++ (точно знаю, что про написанно в книге "Философия С++")
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.09.2011, 09:37 #10
Цитата Сообщение от Kastaneda Посмотреть сообщение
будет вызван std::istream& operator>>(std::istream&, char*), т.е. оператор вернет ссылку на поток ввода, который ты пробуешь вывести в поток вывода, отсюда и бред в output (странно, что это вообще компилируется).
А что странного? Возвращается ссылка на поток, поток неявно преобразуется в void*, в итоге этот void* и выводится на экран. Будет выводиться любое ненулевое значение, если считывание прошло успешно, и 0 в обратном случае.
0
Van111
211 / 190 / 22
Регистрация: 03.08.2011
Сообщений: 2,648
Записей в блоге: 12
03.09.2011, 19:56 #11
Цитата Сообщение от AlexH Посмотреть сообщение
const int MAX = 256; int main() { char buf[MAX]; std::cout<<(std::cin>>buf); return 0; }
маленкое замечание на будущее
const int MAX = 255;
char buf[MAX];
я так понял что 256 это количество букв(типа максимальное)а максимальное полюбасу 255 байт с нулевым смещением buf[0]указывает на колвол букв
0
TheAthlete
154 / 154 / 16
Регистрация: 31.08.2010
Сообщений: 538
04.09.2011, 17:32 #12
в данном случае лучше использовать std::string вместо char, он имеет больше возможностей и нет проблем с выделением памяти, буферов

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
 
using std::cout;
using std::cin;
using std::endl;
using std::string;
 
int main() {
string word;
 
while (cout << "Enter word: ", cin >> word) {
cout << word << endl;
}
return 0;
}
Здесь нужно ввести слово и оно сразу будет выводится на экран. В реальной программе можно сохранять данные или сразу обрабатывать.

Как известно, цикл while работает, пока условие истинно. В нашем случае условие будет истинным, пока не встретится конец файла (Ctrl-Z), либо если значение не соответствует типу.
Для выхода из программы нужно нажать Ctrl-Z

В цикле while в данном примере еще участвует оператор ',' (запятая), результатом которого является правый операнд, т.е. в нашем случае выражение cin >> word

Что касается книг, то наиболее полное руководство по операторам ввода/вывода языка C++ можно найти в книге "Николай Джосьютис. С++ Стандартная библиотека. Для профессионалов" в главе 13 "Ввод-вывод с использованием потоковых классов"
0
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
04.09.2011, 17:39 #13
Цитата Сообщение от Сыроежка Посмотреть сообщение
Все очень просто. Первое считывание std::cin>>buf считывает символ 'a'. То есть считывает до разделяющего пробела...
Если быть точнее, то сначала из входного потока пропускаются все подряд идущие символы из множества {' ', '\n', '\t'} до первого символа, не принадлежащего этому множеству, и этот символ (вернее, его код) будет записан в переменную buf
0
04.09.2011, 17:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2011, 17:39
Привет! Вот еще темы с решениями:

Std::cin, символ новой строки
Подскажите, куда в данном примере после каждого cin'а девается символ новой...

std::cin & switch case
Всем привет. Вообщем проблема такая: while(val) { int choice;...

Как исправить ошибку с std::cin
помогите у меня пропускает последующие вводы если вводишь знак или букву вот...

Std:cin ввод нескольких значений
Нужно ввести строку с параметром cin &gt;&gt; command; //ввели add_int 5 ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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