2014-09-02 2 views
0

Следующие коды, кажется, дают непоследовательные ответы вместо ожидаемого результата, интересно, почему.scanf с форматированным поплавком

$ cat chk.c 
#include <stdio.h> 

int main() 
{ 
     float a; 

     scanf("%4.1f", &a); 
     printf("%4.1f\n", a); 

     return 0; 
} 

$ cc chk.c && ./a.out 
12.1 
0.0 
$ 

Это не совсем правильно считывает ввод! Может ли кто-нибудь объяснить это поведение, пожалуйста? Я попробовал несколько версий GCC на Linux с тем же результатом, и сетевой поиск тоже не был полезен.

+2

Прецизионность, не являющаяся частью спецификации формата scanf. –

+1

Шаг 1: отбросьте '' \ n'' в 'scanf ("% 4f \ n ", &a);'. Это позаботится о первой проблеме. – chux

ответ

1

Если у вас есть пробелы в формате scanf, это означает, что все символы будут прочитаны до тех пор, пока не будет больше пробелов. Чтобы сделать это, вам нужно подождать, пока вы не введете что-то, что не является пробелом, поэтому он выглядит так, как будто он просит ввести более одного значения. Использование "\n" не означает, что вы читаете один символ charline, это означает, что вы читаете все пробелы.

В отличие от строки формата printf, точность не является частью строки формата scanf, так scanf просто не в состоянии прочитать поплавок в вашем втором примере. В результате вы печатаете неинициализированное значение, которое происходит для печати 0.0. Получение значения неинициализированной переменной - это неопределенное поведение, поэтому она могла бы что-то сделать.

Смежные вопросы