Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/22: Рейтинг темы: голосов - 22, средняя оценка - 4.64
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926

Как сделать проверку на double в scanf, если ожидается int?

05.12.2012, 23:45. Показов 4955. Ответов 11

Студворк — интернет-сервис помощи студентам
Возможно ли как-то средствами scanf отловить ввод десятичной точки, чтобы отловить ввод типа 5.8 или 5.0, то есть когда в числе присутствует десятичная точка, а scanf ожидает целое? Другие функции по условию задачи использовать нельзя, а дополнительную переменную double использовать не хочется. Есть варианты?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.12.2012, 23:45
Ответы с готовыми решениями:

Написать функцию int Search ( double A[], int n , double x), которая находит в массиве double A[n] элемент, значение которого равно x
Написать функцию int Search ( double A, int n , double x), которая находит в массиве double A элемент, значение которого равно x. Функция...

Как сделать так, чтобы TextBox принимал только типы double и int?
Такая проблема: надо чтобы с текстбокс принимал только типы double и int. Как это сделать?

Как сделать проверку если файл в папке?
Как сделать проверку если файл в папке? файл - fio.mdb

11
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
06.12.2012, 00:50
#pragma, Да пошли ты этот scanf куда подальше! Это самое неудачное, что придумали великие K&R. Простите их. Они придумали так много и так много хорошего, они просто мир программистский с головы на ноги поставили. А со scanf-ом не дотянули чуток. Хотя старались. scanf - симметрия printf. То что выведенное printf-ом scanf замечательно поймет. А то, что вводит шальной пользователь руками - ну нет на него никакой надежды. Когда я начал что-то кропать на Си, scanf я использовал только один раз. И последний. Для серьезной работы надо читать строку и самому ее разбирать. Что ты ожидаешь от ввода? Какие могут несоответствия с твоими ожиданиями? У scanf своя политика ожиданий, годящаяся для простенького студенческого ввода. Для чего-нибудь хоть чуток более серьезного он совершенно не годен.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
06.12.2012, 18:36
#pragma, абсолютно не согласен с Байт, scanf - прекрасная функция, только её использовать надо по назначению и согласно с руководством.

Цитата Сообщение от #pragma Посмотреть сообщение
дополнительную переменную double использовать не хочется
Ну а профит с неё? Выяснять, является ли её содержимое целым числом?
Я бы не мудрствуя лукаво как-то так сделал
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
#include <stdio.h>
#include <ctype.h>
 
void flush_input(void) {
    char c;
    while ( scanf("%c", &c) == 1 && c != '\n' )
        ;
}
 
int main(void) {
    int n;
    char c;
    
    while ( printf("Number: ") && scanf("%d", &n) == 1 ) {
        if ( scanf("%c", &c) == 1 && ! isspace(c) ) {
            printf("Wrong!\n");
            flush_input();
        }
        else
            printf("Ok\n");
    }
    
    return 0;
}
хотя и несколько громоздко...
0
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
06.12.2012, 21:24  [ТС]
Байт,
easybudda, Как я упомянул, у меня ограничение на использование вспомогательных функций (и заголовочных файлов тоже), такое задание. Список запрещённых идентификаторов (слов) в исходнике:
C
1
2
3
4
5
6
7
8
 fflush
 malloc
 realloc
 math.h
 ctype.h
 string.h
 stdlib.h
 time.h
Поэтому так и поставил вопрос, можно ли добиться этого только средствами scanf ( магия какая-нибудь и прочее ).
Про целесообразность речи не идёт, это специально упражнение такое, делаемое только средствами "изученных" функций
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.12.2012, 00:37
Цитата Сообщение от #pragma Посмотреть сообщение
у меня ограничение на использование вспомогательных функций (и заголовочных файлов тоже), такое задание.
А! Ну если такое задание... Я давно от заданий отвык, я работаю. Так что, простите, я не в теме

Добавлено через 6 минут
Это специально упражнение такое, делаемое только средствами "изученных" функций
Препод ваш йогой-то не балуется? Аль может быть в Тибете проходил практику? Может быть тогда у него стоит спросить, что есть Истина?
0
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
07.12.2012, 00:51  [ТС]
Решение оказалось простым: при вызове scanf %d читается целая часть числа, после чего в буфере остаётся точка. При следующем вызове scanf (с форматом %d) вернёт 0, а это уже можно поймать в программе.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
07.12.2012, 02:31
Цитата Сообщение от #pragma Посмотреть сообщение
Решение оказалось простым: при вызове scanf %d читается целая часть числа, после чего в буфере остаётся точка. При следующем вызове scanf (с форматом %d) вернёт 0, а это уже можно поймать в программе.
Очень сомнительное решение. То есть если при первом вызове вместо 100500 ввести 1ОО5ОО - программа как ни в чём не бывало прочитает единицу из потока ввода и возьмёт её за должное значение. И ничего страшного, что ввод был неправильный...
0
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
07.12.2012, 02:48  [ТС]
Цитата Сообщение от easybudda Посмотреть сообщение
Очень сомнительное решение. То есть если при первом вызове вместо 100500 ввести 1ОО5ОО - программа как ни в чём не бывало прочитает единицу из потока ввода и возьмёт её за должное значение. И ничего страшного, что ввод был неправильный...
У меня программа завершается, если такое случается, так как проверяется сам факт существования в потоке символов, которых там быть не должно (scanf же 0 возвращает в этом случае), так что всё нормально Я проверил всякие случаи, всё работает.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
07.12.2012, 02:59
Цитата Сообщение от #pragma Посмотреть сообщение
У меня программа завершается, если такое случается, так как проверяется сам факт существования в потоке символов, которых там быть не должно (scanf же 0 возвращает в этом случае), так что всё нормально Я проверил всякие случаи, всё работает.
С чего бы это? При вводе к примеру 3.14 конструкция scanf("%d", &int_var) вернёт 1, переменная получит значение 3 и до следующей попытки прочитать значение программа будет считать, что всё в порядке, а казалось бы должна была ругнуться.
Вот ещё замысловатая конструкция:
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
#include <stdio.h>
 
void flush_input(void) {
    char c;
    while ( scanf("%c", &c) == 1 && c != '\n' )
        ;
}
 
int main(void) {
    int n, ret;
    char tail[2];
    
    while ( printf("Число: ") > 0 ) {
        ret = scanf("%d%1[^\n]", &n, tail);
        switch ( ret ) {
            case 1 :
                printf("Всё хорошо, значение: %d\n", n);
                break;
            case 2 :
                printf("Всё плохо, лишний символ: %c\n", *tail);
                flush_input();
                break;
            default :
                printf("Всё очень плохо!\n");
                return 1;
        }
    }
    
    return 0;
}
Code
1
2
3
4
5
6
7
8
9
10
11
~/cpp/other $ gcc -o check_number check_number.c 
~/cpp/other $ ./check_number 
Число: 3
Всё хорошо, значение: 3
Число: 14
Всё хорошо, значение: 14
Число: 3.14
Всё плохо, лишний символ: .
Число: ddd
Всё очень плохо!
~/cpp/other $
0
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
07.12.2012, 04:37  [ТС]
Вот, это кусок проверки ввода в упражнении
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
38
39
40
41
42
43
/* -------------------------------------------------------------------------- */
#include <stdio.h>
/* -------------------------------------------------------------------------- */
#define MIN_NUMBER_OF_PLAYERS  0
#define MAX_NUMBER_OF_PLAYERS 49
/* -------------------------------------------------------------------------- */
int main()
{
   int    result            = 0;
   int    number_of_players = 0;
 
   printf("Enter the number of players: \n");
   result = scanf ("%d", &number_of_players);
 
   if (result == EOF) {
      return 1;
   }
 
   if (result == 0) {
      printf("Invalid input!\n");
      return 1;
   }
 
   if ( (number_of_players < MIN_NUMBER_OF_PLAYERS) ||
        (number_of_players > MAX_NUMBER_OF_PLAYERS)   ) {
 
      do {
         printf("Please enter a valid number of players [0..49]\n");
         result = scanf ("%d", &number_of_players);
 
         if (result == EOF) {
            return 1;
         }
 
         if (result == 0) {
            printf("Invalid input!\n");
            return 1;
         }
 
      } while ( (number_of_players < MIN_NUMBER_OF_PLAYERS) ||
                (number_of_players > MAX_NUMBER_OF_PLAYERS) || result != 1);
 
   }
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
07.12.2012, 11:33
#pragma, ну и где здесь проверка, что пользователь не ввёл дробное число? Был такой старый советский мультик, там у одного нерадивого ученика ответом на задачу получилось полтора землекопа. Так вот, если ввести 1.5, количество игроков установится в 1, при этом пройдёт проверку, как допустимое значение, а .5 так и будет болтаться в потоке ввода, пока ещё какое-нибудь значение прочитать не понадобится. То есть поставленная в первом посте задача не выполняется.
0
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
07.12.2012, 16:09  [ТС]
Надо было просто весь код выложить Единственный случай, который неправильно учитывается, это 0.* Надо ещё else добавить.

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/* -------------------------------------------------------------------------- */
#include <stdio.h>
/* -------------------------------------------------------------------------- */
#define MIN_NUMBER_OF_PLAYERS  0
#define MAX_NUMBER_OF_PLAYERS 49
/* -------------------------------------------------------------------------- */
int main()
{
   int    result            = 0;
   int    number_of_players = 0;
 
   printf("Enter the number of players: \n");
   result = scanf ("%d", &number_of_players);
 
   if (result == EOF) {
      return 1;
   }
 
   if (result == 0) {
      printf("Invalid input!\n");
      return 1;
   }
 
   if ( (number_of_players < MIN_NUMBER_OF_PLAYERS) ||
        (number_of_players > MAX_NUMBER_OF_PLAYERS)   ) {
 
      do {
         printf("Please enter a valid number of players [0..49]\n");
         result = scanf ("%d", &number_of_players);
 
         if (result == EOF) {
            return 1;
         }
 
         if (result == 0) {
            printf("Invalid input!\n");
            return 1;
         }
 
      } while ( (number_of_players < MIN_NUMBER_OF_PLAYERS) ||
                (number_of_players > MAX_NUMBER_OF_PLAYERS) || result != 1);
 
   }
 
   if (number_of_players > 0) {
 
      int ranks[number_of_players];
 
      /* Catching the dot from previous input. */
      result = scanf ("%d", &ranks[0]);
 
      if (result == EOF) {
         return 1;
      }
 
      if (result == 0) {
         printf("Invalid input!\n");
         return 1;
      }
 
      printf("Enter the rank of each player: \n");
 
      for (int i = 1; i < number_of_players; ++i) {
 
         result = scanf ("%d", &ranks[i]);
 
         if (result == EOF) {
            return 1;
         }
 
         if (result == 0) {
            printf("Invalid input!\n");
            return 1;
         }
 
         if (ranks[i] < 0) {
            printf("Please enter a valid rank ( rank >=0 )\n");
            --i;
         }
      }
 
      int rank_difference = 0;
 
      for (int i = 0; i < number_of_players ; ++i) {
 
         for (int k = 0; k < i + 1; ++k) {
            printf("|      ");
         }
 
         for (int j = i + 1; j < number_of_players; ++j) {
 
            rank_difference = ranks[j] - ranks[i];
 
            if (rank_difference < 0) {
               rank_difference = -rank_difference;
            }
            printf("| %4d ",rank_difference);
         }
         printf("|\n");
      }
   }
 
   return 0;
}
/* -------------------------------------------------------------------------- */
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.12.2012, 16:09
Помогаю со студенческими работами здесь

Как из числа типа double сделать int (сохранение целой и дробной части в отдельных целочисленных переменных)
Например есть число double d = 123.4567 Как сделать что бы int i1 = 123; int i2 =4567;

Как сделать так, чтобы scanf в переменную double мог считывать с клавиатуры не только "0,01", но и "0.01"
Помогите!) Не знаю, искал, не нашел, возможно ли вообще. Чтобы и так и так понимал.

Как сделать проверку, и если значение не подходит - выводить сообщение с ошибкой?
как сделать проверку что бы если значения не подходит то выводило сообщение с ошибкой и после нажатия Enter программа закрывалась? 13...

Как сделать проверку, если такого значения нет в datagrid, то вывести ошибку?
Как сделать проверку, если такого значения нет в datagrid, то вывести ошибку for (int i = 0; i &lt; dataGridView1.RowCount; i++)//тут...

Размерность int или как из signed int сделать unsigned int?
Добрый день. Есть старая база уже с некоторыми данными. При развёртывании её на одном из тестовых серверов столкнулся с неожиданной...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru