LINUX.ORG.RU

Как использовать scanf() для неизвестного типа данных на вводе?

 ,


0

3

Доброго дня! Объясните, пожалуйста, как это сделать в С. Что-то типа такого

int S;
printf("Введите S:\n");
scanf("%d", &S);
Но ввод может быть как 10, так и 13.4, и если на вводе float, то как его поместить в переменную? Понимаю что нужно определить тип данных, но для этого сначала нужно данные поместить в переменную. Гугл не помог. Спасибо за помощь :)

★★★★

Понимаю что нужно определить тип данных, но для этого сначала нужно данные поместить в переменную.

Используй float. Никто не запрещает хранить в нем целочисленные.

Meyer ★★★★★
()
Ответ на: комментарий от Meyer

Мне все равно нужно проверить. Если три ввода целочисленные, то и четвертый должен быть целочисленным.

dnb ★★★★
() автор топика
Ответ на: комментарий от dnb

Мне все равно нужно проверить.

Что мешает использовать float вместо int, и проверять, введено ли целочисленное (ceilf(S) == S или roundf(S) == S)?

Meyer ★★★★★
()
Последнее исправление: Meyer (всего исправлений: 1)

Ввод сохрани как строку отдай в strstr(str,".") и если там есть точка то значит есть флоат (хотя может и нет если у тебя там по иному случаю точки могут быть), scanf поддерживает регулярные выражения. Или опять же берёшь строку берёшь кусок от разделителя до разделителя проверяешь если там есть точка то это флоат и передаёшь тому scanf который флоат читает иначе передаёшь тому который int читает.

FUNCTION
()

я этого сначала нужно данные поместить в переменную.

В переменную char * ты вноси ввод, в нём определяй тип данных и уже исходя из этого отдавай данные от туда в фундаментальный тип int || float

FUNCTION
()

Тут лучше всего будет считать флоты, а потом сделать условный каст к интам

Crocodoom ★★★★★
()

Не знаешь тип - читай строки.

slovazap ★★★★★
()

Вообще, лучше всего поменять логику, чтобы знать, что тебе придёт. Если по каким-то причинам этот вариант не рассматривается, то бери стоку и пытайся преобразовать её к другим типам

XMs ★★★★★
()

Но ввод может быть как 10, так и 13.4, и если на вводе float, то как его поместить в переменную?

У вас проблема не в C/scanf/объявление переменных. А в постановке задачи. Что значить поместить в переменную что-угодно? А если пользователь введёт «quit»? Тут про точку начали бодягу, но и 1e3 вполне валидное действительное число без точки. Вначале стоит определиться, вы работаете быстро и тупо с данными, либо долго и нудно проверяете на валидность и разъясняете пользователю, где он не то вводит. Нужна вам точность после запятой или нет. Если нужна, то почему вы хотите работать с int?

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)

scanf - очень плохо! Лучше свой обработчик напиши!!!

anonymous
()

Считывай строку и парси.

meliafaro ★★★★★
()
Ответ на: комментарий от beastie

Моё замечание было не о том, но пусть тогда уже будет strpbrk(str, ".,eE").

xaizek ★★★★★
()
Ответ на: комментарий от Meyer

Используй float. Никто не запрещает хранить в нем целочисленные.

До 16 миллионов. Потом нельзя.

anonymous
()

Человек тут может простенькую лабораторку в институте пытается написать, а вы ему свой парсер советуете. Читай float.

goingUp ★★★★★
()
Ответ на: комментарий от anonymous

До 16 миллионов. Потом нельзя.

Тогда long double.

Meyer ★★★★★
()
Ответ на: комментарий от goingUp

Именно лабораторку, 1 курс :) Я понимаю как это сделать на Go, я много чего на нем написал или даже на С++. А вот опыта с чистым С у меня почти нет.

dnb ★★★★
() автор топика
Ответ на: комментарий от xaizek

strchr(str, '.') тут лучше подойдёт.

лучше всего подойдет strstr(str, nl_langinfo(RADIXCHAR));

ananas ★★★★★
()
Ответ на: комментарий от dnb

В си нету абстракции данных. Здесь надо считывать число в виде строки, анализировать, а затем уже конвертировать в нужный числовой тип с помощью atoi и atof.

Но у меня есть уверенность, что ты не совсем верно понял задание лабораторной.

neon1ks ★★
()
Последнее исправление: neon1ks (всего исправлений: 1)
Ответ на: комментарий от neon1ks

Но у меня есть уверенность, что ты не совсем верно понял задание лабораторной.

Найти все возможные значения S и F из лабораторной работы №2 для задаваемого диапазона и шага изменения указанной величины. Если величина целая, то и шаг целый. Решение задачи организовать с помощью операторов циклов.

Вот мне надо проверить тип S и F, и если хоть один целочисленный, то остальные округлить до целого.

dnb ★★★★
() автор топика
Ответ на: комментарий от dnb

В Си есть функция strtoll, она и попала из Си в C++.

Можно считать число как double и проверить есть у него дробная часть функцией modf.

neon1ks ★★
()

Все кто советует читать числа, вон из профессии. Единственно верный вариант читать строку и потом парсить что получится.

И ваще, юзай fgets.

Deleted
()
Последнее исправление: rj45 (всего исправлений: 1)
Ответ на: комментарий от Deleted

Писать свои костыли? И чем плох scanf?

Функция возвращает количество считанных данных, что позволяет проверить успешность считывания.

neon1ks ★★
()
Последнее исправление: neon1ks (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.