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

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

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

std::cin - C++

02.09.2011, 21:06. Просмотров 6537. Ответов 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++
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++ 2005 Express Edition. Образ диска...

Не работает std::cout || std::cin - C++
#include &quot;Account.h&quot; #include &lt;string&gt; #include &lt;iostream&gt; using std::cout; Account :: Account(int startBalance) { ...

Из 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.getline (вижуал с++) - C++
собственно выводит в консоль нормально, а вот после считывания с консоли в символьный массив попадают крокозябры: #include &quot;stdafx.h&quot; ...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 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
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
02.09.2011, 21:15 #4
.........
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 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
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 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
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
02.09.2011, 21:31 #9
Цитата Сообщение от AlexH Посмотреть сообщение
Спасибо, где про это можно почитать подробней?
Ну очевидно в любой вменяемой книге по С++ (точно знаю, что про написанно в книге "Философия С++")
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 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
кодер с++
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 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
153 / 153 / 13
Регистрация: 31.08.2010
Сообщений: 535
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
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
04.09.2011, 17:39 #13
Цитата Сообщение от Сыроежка Посмотреть сообщение
Все очень просто. Первое считывание std::cin>>buf считывает символ 'a'. То есть считывает до разделяющего пробела...
Если быть точнее, то сначала из входного потока пропускаются все подряд идущие символы из множества {' ', '\n', '\t'} до первого символа, не принадлежащего этому множеству, и этот символ (вернее, его код) будет записан в переменную buf
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2011, 17:39
Привет! Вот еще темы с ответами:

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

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


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

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

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