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

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

Войти
Регистрация
Восстановить пароль
 
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 432
#1

Ввод cin - C++

31.07.2013, 13:44. Просмотров 759. Ответов 3
Метки нет (Все метки)

Я тут раньше задавал подобный вопрос, то тема умерла, по ходу. Здесь приведен листинг функции ввода калькулятора из книги Страуструпа.
Объясните мне тупому, как тут осуществляется ввод?
Ввод всего всего выражения целиком (например,2 + 4 * 8) происходит в
C++
1
if(!cin.get(ch)) return curr_tok = END;
?
Если да, то ведь в плюсах буферизованное выражения после прочтения
C++
1
while (ch!='\n' && isspace(ch))
выкидывается и нигде не хранится, тогда как происходит дальнейшее обращение к ch?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
token_value get_token () {
    char ch;
    do {                            //ïðîïóñêГ*ГҐГІ îáîáùåГ*Г*ûå ïðîáåëû Г§Г* èñêëþ÷åГ*ГЁГҐГ¬ \n
        if (!std::cin.get (ch)) return curr_tok = END;
    } while (ch != '\n' && isspace (ch));
    switch (ch) {
        case ';':
        case '\n':
            std::cin >> std::ws;
            return curr_tok = PRINT;
        case '*':
        case '/':
        case '+':
        case '-':
        case '(':
        case ')':
        case '=':
            return curr_tok = token_value (ch);
        case '0': case '1': case '2': case '3': case '4':
        case '5': case '6': case '7': case '8': case '9':
        case '.':
            std::cin.putback (ch);
            std::cin >> number_value;
            return curr_tok=NUMBER;
        default:
            if (isalpha (ch)) {
                char* p = name_string;
                *p++ = ch;
                while (std::cin.get (ch) && isalnum (ch)) *p++ = ch;
                std::cin.putback (ch);
                *p = 0;
                return curr_tok=NAME;
            }
            error ("wrong lexical token");
            return curr_tok=PRINT;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2013, 13:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ввод cin (C++):

Защита от дурака при вводе текста с помощью: cin.get cin.clear cin.sync - C++
Доброго времени суток. На С++ учусь с недавних пор. Имеется стандартная "защита от дурака" на ввод. Не пойму предназначение cin.get() !=...

Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear() - C++
Такая проблема: сдаю в вуза лабораторные по программированию, писал все сам, до этого c++ не изучал, поэтому возникали некоторые проблемы....

Корректный ввод с cin - C++
Пусть в программе есть оператор cin >> n, где n типа int, а пользователь вводит набор символов Как отследить это, не выдавая ошибку, и не...

Ввод текста по cin - C++
Доброго времени суток. имею следующий код: OpenAsper oAsper; cin>>pathS; path = new char ; strcpy( path, pathS.c_str() ); ...

Ввод с cin с пробелами - C++
Здравствуйте! Делаю стандартное задание по структурам. Пока сделано только добавление и показ всего. Но вот проблемка. Если название...

ввод данных cin >> - C++
Приветствую! #include <iostream> using namespace std; int main() {setlocale (LC_ALL,""); int qt; float...

3
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
31.07.2013, 14:57 #2
Цитата Сообщение от tramp_1-3 Посмотреть сообщение
выкидывается и нигде не хранится, тогда как происходит дальнейшее обращение к ch?
вот тут возвращается
Цитата Сообщение от tramp_1-3 Посмотреть сообщение
std::cin.putback (ch);
1
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
31.07.2013, 15:04 #3
Цитата Сообщение от tramp_1-3 Посмотреть сообщение
Ввод всего всего выражения целиком (например,2 + 4 * 8) происходит в
C++
1
if(!cin.get(ch)) return curr_tok = END;
По моему, этот цикл просто отсеивает передние пробелы (до перевода строки), а само чтение идет в
C++
1
while (std::cin.get (ch) && isalnum (ch)) *p++ = ch;
1
tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 432
31.07.2013, 15:16  [ТС] #4
Цитата Сообщение от Tulosba Посмотреть сообщение
вот тут возвращается
Если Вас не затруднит, можете мне хоть примерно описать что происходит, если пользователь вводит например 2 + 3*4? что, как и где обрабатывается? просто очень тяжело понять принцип работы этих потоков, когда обрабатывается вроде бы всё выражение, но используется всего лишь один символ
0
31.07.2013, 15:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2013, 15:16
Привет! Вот еще темы с ответами:

Игнорирует ввод cin - C++
Не могу понять почему не считывает переменную 'q' в 13 строке. Программа просто обходит её стороной. #include <iostream> #include...

Cin.getline, ввод 2 переменных - C++
Здравствуйте. Подскажите, где ошибся Первое значение пропускает и не дает его ввести, остается пустым, второе значение заполняется... ...

cin читает прежний ввод - C++
Проблема такая, вот код. Когда я пишу /add все сначала норм, спрашивает cin>> queADD;, но когда доходит до cin>> ansADD;, то он второе...

Почему не происходит ввод? (cin) - C++
Здравствуйте. Скажите, пожалуйста, почему нету приглашения ввести переменную s? int main() { cout<<"Enter digits, for exit...


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

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

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