2015-07-27 2 views
0

Как я могу взять число с плавающей запятой только одну цифру после десятичной точки (0,1), используя scanf на языке C? Например, пользователь может набрать 3.25405 ... но в переменной будет сохраняться только 3.2. Как я могу это сделать ? Это отличается от округления числа с плавающей запятой.Одна цифра после десятичной точки во вводе

+3

Попробуйте ввести '0,1' и увидеть результат в отладчике. Вы можете быть удивлены. – Olaf

+3

Как правило, никогда не читайте пользовательский ввод через 'scanf()'. Эта функция просто не предоставляет достаточных возможностей для изящного извлечения из условий ошибки, таких как несоответствия формата и т. Д. Прочитайте всю строку ввода, затем проанализируйте ее в памяти (например, через 'strtod()'). – DevSolar

+0

Возможно, вы не можете сделать это за один шаг: scanf (ни fscanf, ни любой другой вариант, ни основная функция strtod) не имеют никакого положения для частичной интерпретации десятичной части, оно будет пытаться сопоставить как можно больше цифр. – AntoineL

ответ

0
scanf("%3f",&float_var); 

Когда «3» для трех символов 3.2 («3» + «» + „2“) Это, очевидно, если вы знаете, что вы будете иметь ряд с только одна цифра перед '.'

Приветствия,

1

Я не думаю, что вы можете сделать это за один проход, так как зсапЕ не имеет, как Printf делает, параметр «точность». Поэтому вместо этого я бы сделал:

int m, n; 
float f; 
scanf("%d.%1d", &m, &n); 
if (m >= 0) 
    f=(float)m + ((float)n)/10; 
else 
    f=(float)m - ((float)n)/10; 

Надеюсь, это поможет.

Я установил начальное решение, основанное на commebts ниже

+0

Я бы использовал double, а не float для результата, поскольку scanf делает ... – AntoineL

+0

1) 'n' &' m' отменено? 2) Предложите 'long long' для части _whole_. 3) вместе взятые учитывают знак 'f = целое + (целое <0? -1: 1) * fraction/10.0.', ​​как указано выше, когда' whole <0' 4) предлагают 'unsigned' фракцию. – chux

+0

@chux да, m и n обратный - это опечатка. Я не понимал вопроса о знаке, хотя, спасибо, что указал на это. –

1

читать с помощью fgets() и пост-процесс буфера. @DevSolar

char buf[100]; 
if (fgets(buf, sizeof buf, stdin) == NULL) Handle_EOF(); 
char *p = strchr(buf,'.'); 
if (p && isdigit(p[1])) p[2] = 0; 
char *endptr; 
double y = strtod(buf, &endptr); 
... 

Еще лучше, чтобы предупредить пользователя о игнорировали дополнительного входа.

if (p && isdigit(p[1])) { 
    if (p[2] && p[2] != '\n') puts("Extra input ignored."); 
    p[2] = 0; 
} 
char *endptr; 
double y = strtod(buf, &endptr); 
Смежные вопросы