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

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

Войти
Регистрация
Восстановить пароль
 
Derpy
3 / 3 / 0
Регистрация: 25.12.2011
Сообщений: 20
#1

Странность в цикле While - C++

25.12.2011, 02:06. Просмотров 835. Ответов 11
Метки нет (Все метки)

В случае возвращения функцией сканф нуля получается бесконечный цикл но выполняется только 2 принтфа (ввода числа больше не появляется). Подскажите пожалуйста в чем ошибка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
int ti=0;
float tempd=0;
        while(ti<1)
        {
            printf("Enter deciati4noe 4hislo\n");
            ti=scanf("%f",&tempd);
            if(ti==0)
            {
                printf("Neverni vvod\n");
                //getch();
            }
        };
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2011, 02:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Странность в цикле While (C++):

Странность С++ и SDL - C++
Здравствуйте уважаемые форумчане возникла непонятная ситуация вообщем писал на С++ классы и учил OpenGL и все вроде нормально как вдруг...

странность массива - C++
вот программа для замены символов все работает правильно, но только если я ввожу одно число, а если я ввожу два числа через пробел то под...

Странность с динамическим массивом - C++
Меня в тупик поставило следующая ошибка (&quot;Название исполняемого файла&quot; has triggered a breakpoint.) В данном простеньком коде. Кто...

Странность определения размера памяти структуры - C++
Здравствуйте. Никогда с таким не сталкивался, а сейчас просто крышу снесло пока нашёл ошибку там, где не ожидал... struct STRUCT{INT32...

Небольшая странность в "Hello World!" - C++
Начал изучать C++ по учебнику &quot;Джесс Либерти - Освой самостоятельно С++ за 21 день&quot; И сразу же столкнулся с проблемой: в книге имеется...

Странность - C (СИ)
#include &lt;stdio.h&gt; void quicksort(int *arr, int b, int e) { int l = b, r = e; int ipiv = (l + r)/2; int piv = arr;...

11
2e1553ce
1 / 1 / 1
Регистрация: 16.12.2011
Сообщений: 47
25.12.2011, 02:22 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int ti=0;
float tempd=0;
                while(ti<1)
                {
                        printf("Enter deciati4noe 4hislo\n");
                        scanf("%f",&tempd);
                        ti=tempd;
                        if(ti==0)
                        {
                                printf("Neverni vvod\n");
                                //getch();
                        }
                };
0
Derpy
3 / 3 / 0
Регистрация: 25.12.2011
Сообщений: 20
25.12.2011, 02:39  [ТС] #3
Цитата Сообщение от 2e1553ce Посмотреть сообщение
ti=tempd;
Если так то ti тут вобще не нужно можно сразу с темпом сравнивать.
И этот вариант приводит к такому же результату
0
darkknight2008
62 / 62 / 6
Регистрация: 16.10.2011
Сообщений: 200
25.12.2011, 02:43 #4
Кинь программу полностью.

Добавлено через 1 минуту
Не надо.... После закрывающей скобки цыкла while убери точку с запятой.
0
Derpy
3 / 3 / 0
Регистрация: 25.12.2011
Сообщений: 20
25.12.2011, 02:49  [ТС] #5
Цитата Сообщение от darkknight2008 Посмотреть сообщение
После закрывающей скобки цыкла while убери точку с запятой.
Ничего не изменилось
0
2e1553ce
1 / 1 / 1
Регистрация: 16.12.2011
Сообщений: 47
25.12.2011, 02:53 #6
я чет не пойму где ошибка, все правильно ж работает?: D
0
Derpy
3 / 3 / 0
Регистрация: 25.12.2011
Сообщений: 20
25.12.2011, 02:58  [ТС] #7
Цитата Сообщение от 2e1553ce Посмотреть сообщение
я чет не пойму где ошибка, все правильно ж работает?: D
Если ввести число то всё правильно. А если ввести символы уходит в бесконечный цикл. Компилятор Visual Studio 2010

Добавлено через 1 минуту
Причем выполняется не всё тело цикла
0
darkknight2008
62 / 62 / 6
Регистрация: 16.10.2011
Сообщений: 200
25.12.2011, 03:09 #8
Я разобрался с твоей проблемой. Дело в том что когда ты вводишь вместо числа строку например 'abc' ты подтверждаешь ввод нажатием Enter. scanf берет символы abc пытается преобразовать в число, у него не получается. Но дело в том, что scanf взял abc но enter(символ '\n') остался в буфере ввода, и когда цикл идет на следующий шаг, то scanf находит в буфере нажатие Enter и считает что ввод закончен и пытается пустую строку преобразовать в число и так до бесконечности, потому что нажатие Enter не исчезло. Чтобы его отловить достаточно после вызова scanf вызвать например функцию getchar().
1
insolent
826 / 344 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
25.12.2011, 03:21 #9
scanf() возвращает число присвоенных элементов ввода или EOF
0
Derpy
3 / 3 / 0
Регистрация: 25.12.2011
Сообщений: 20
25.12.2011, 03:48  [ТС] #10
Цитата Сообщение от insolent Посмотреть сообщение
scanf() возвращает число присвоенных элементов ввода или EOF
По стандарту да но ti==EOF не работает. Потому что EOF преобразовывается в -1 а в данном случае возвращается 0.

Добавлено через 3 минуты
Цитата Сообщение от darkknight2008 Посмотреть сообщение
Чтобы его отловить достаточно после вызова scanf вызвать например функцию getchar().
Очень странно но получается ручная промотка бесконечного цикла. Тоже без нового ввода.
0
darkknight2008
62 / 62 / 6
Регистрация: 16.10.2011
Сообщений: 200
25.12.2011, 11:23 #11
Перепроверил все и вижу накладку. как я понял, если scanf не смог опознать ввод(Например введено abc вместо числа), то он буфер ввода не очиищает, т.е. в буфере ввода остается abc и происходит зацикливание. Чтобы решить проблему, нужно в случае неправильного ввода(ti == 0) очистить буфер ввода. Это можно сделать при помощи вызова fflush(stdin);
П.С.: scanf возвращает EOF когда поле формата NULL, так что проверять это не нужно.
1
Derpy
3 / 3 / 0
Регистрация: 25.12.2011
Сообщений: 20
25.12.2011, 13:23  [ТС] #12
Цитата Сообщение от darkknight2008 Посмотреть сообщение
Это можно сделать при помощи вызова fflush(stdin);
Вот это помогло спасибо
0
25.12.2011, 13:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2011, 13:23
Привет! Вот еще темы с ответами:

Странность - Жесткие диски
Вобщем, дело такое, есть жесткий диск в ноутбуке, рабочий, сейчас используется, его история очень богата: Он пережил убийство его...

Странность с Daemon-ом - Носители информации
Последние пол года дисковод перестал читать DWD, при чем иногда некоторые DWD диски время от времени открывает, а потом опять не читает. Ну...

странность делфи - Delphi
при нажатии enter в коде не создается новая строка а бегунок просто перескакивает на следущую как решить проблему?

странность в коде - jQuery
Доброго времени суток :) на странице есть div &lt;div id=&quot;obl&quot;&gt; &lt;/div&gt; после неё я написал скрипт который должен вывести...


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

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

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