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

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

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

std::cin - C++

02.09.2011, 21:06. Просмотров 6414. Ответов 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
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2011, 21:06     std::cin
Посмотрите здесь:

Из scanf в std::cin - C++
Как тоже самое сделать с помощью std::cin? printf(&quot;Введите автора %d книги.\n&quot;,i+1); scanf(&quot;%31s &quot;,ar.author); ...

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

std::cin Debug Access failed - C++
Решил начать программировать в visual studio 2012 и сразу наткнулся на какую-то непонятную ошибку вот код: #include &quot;stdafx.h&quot; ...

Как исправить ошибку с std::cin - C++
помогите у меня пропускает последующие вводы если вводишь знак или букву вот код std::cout&lt;&lt;&quot;A: &quot;; std::cin&gt;&gt;AA; ...

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dani
1278 / 636 / 56
Регистрация: 11.08.2011
Сообщений: 2,277
Записей в блоге: 2
Завершенные тесты: 1
02.09.2011, 21:08     std::cin #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 и т.д.
Сыроежка
Заблокирован
02.09.2011, 21:13     std::cin #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', с которым происходят такие же действия. И т.д.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
02.09.2011, 21:15     std::cin #4
.........
Kastaneda
Форумчанин
Эксперт С++
4489 / 2851 / 227
Регистрация: 12.12.2009
Сообщений: 7,245
Записей в блоге: 1
Завершенные тесты: 1
02.09.2011, 21:23     std::cin #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 (странно, что это вообще компилируется).
AlexH
0 / 0 / 0
Регистрация: 02.09.2011
Сообщений: 4
02.09.2011, 21:27  [ТС]     std::cin #6
Kastaneda,
Спасибо, где про это можно почитать подробней?
Kastaneda
Форумчанин
Эксперт С++
4489 / 2851 / 227
Регистрация: 12.12.2009
Сообщений: 7,245
Записей в блоге: 1
Завершенные тесты: 1
02.09.2011, 21:29     std::cin #7
Цитата Сообщение от AlexH Посмотреть сообщение
Спасибо! а как быть со значением выражения, стоящего внутри while, какие значения оно принимает в этом случае?
Я же выше написал)
Если считывание из потока прошло успешно, то будет выставлен флаг goodbit, и выражение примет значение true. А если при считывании возникли "проблемы" (достигнут конец фала (или символа '\n' в случае с std::cin), неверное значение в потоке и т.д.), то будет выставленн соответствующий флаг, и выражение примет значение false, в этом случае цикл while() перестанет выполнятся.
AlexH
0 / 0 / 0
Регистрация: 02.09.2011
Сообщений: 4
02.09.2011, 21:31  [ТС]     std::cin #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
Я же выше написал)
Если считывание из потока прошло успешно, то будет выставлен флаг goodbit, и выражение примет значение true. А если при считывании возникли "проблемы" (достигнут конец фала (или символа '\n' в случае с std::cin), неверное значение в потоке и т.д.), то будет выставленн соответствующий флаг, и выражение примет значение false, в этом случае цикл while() перестанет выполнятся.
Не успел обновить, сорри.
Kastaneda
Форумчанин
Эксперт С++
4489 / 2851 / 227
Регистрация: 12.12.2009
Сообщений: 7,245
Записей в блоге: 1
Завершенные тесты: 1
02.09.2011, 21:31     std::cin #9
Цитата Сообщение от AlexH Посмотреть сообщение
Спасибо, где про это можно почитать подробней?
Ну очевидно в любой вменяемой книге по С++ (точно знаю, что про написанно в книге "Философия С++")
diagon
Higher
1927 / 1193 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.09.2011, 09:37     std::cin #10
Цитата Сообщение от Kastaneda Посмотреть сообщение
будет вызван std::istream& operator>>(std::istream&, char*), т.е. оператор вернет ссылку на поток ввода, который ты пробуешь вывести в поток вывода, отсюда и бред в output (странно, что это вообще компилируется).
А что странного? Возвращается ссылка на поток, поток неявно преобразуется в void*, в итоге этот void* и выводится на экран. Будет выводиться любое ненулевое значение, если считывание прошло успешно, и 0 в обратном случае.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
03.09.2011, 19:56     std::cin #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]указывает на колвол букв
TheAthlete
152 / 152 / 13
Регистрация: 31.08.2010
Сообщений: 535
04.09.2011, 17:32     std::cin #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 "Ввод-вывод с использованием потоковых классов"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2011, 17:39     std::cin
Еще ссылки по теме:

Локаль в std::cin.getline (вижуал с++) - C++
собственно выводит в консоль нормально, а вот после считывания с консоли в символьный массив попадают крокозябры: #include &quot;stdafx.h&quot; ...

Std::cin, символ новой строки - C++
Подскажите, куда в данном примере после каждого cin'а девается символ новой строки? Насколько помню cin и cin.get его после себя оставляют...

Как заставить std::cin распознавать префиксы? - C++
Здравствуйте, народ. Вы не знаете как заставить cin распознавать префиксы? типо: Ввод: 10 Вывод(в десятичном виде): 10 Ввод: 010 ...

Странное поведение операции XOR и std::cin - C++
Объясните, пожалуйста, почему этот код работает правильно: /* Обмен значений двух переменных без использования дополнительной переменной...

Как проигнорировать последовательность символов в std::cin? - C++
Есть два числа, разделенных последовательностью &quot;--:&quot;. Если бы это делалось при помощи sscanf: sscanf(input, &quot;%d--:-%d&quot;, &amp;a, &amp;b); ...


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

Или воспользуйтесь поиском по форуму:
Thinker
Эксперт C++
4223 / 2197 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
04.09.2011, 17:39     std::cin #13
Цитата Сообщение от Сыроежка Посмотреть сообщение
Все очень просто. Первое считывание std::cin>>buf считывает символ 'a'. То есть считывает до разделяющего пробела...
Если быть точнее, то сначала из входного потока пропускаются все подряд идущие символы из множества {' ', '\n', '\t'} до первого символа, не принадлежащего этому множеству, и этот символ (вернее, его код) будет записан в переменную buf
Yandex
Объявления
04.09.2011, 17:39     std::cin
Ответ Создать тему
Опции темы

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