2015-06-18 6 views
1

Я использую MinGW для Windows 7 для компиляции файлов C.scanf проблема при чтении double

Моя проблема - это странное поведение с scanf(), чтобы читать double с пользовательского ввода.

Мой код:

int main() { 

    double radius = 0; 
    double pi = 3.14159; 

    scanf("%lf \n", &radius); // after the input, it continues waiting... 
    radius = ((radius * radius) * pi); 
    printf("A=%.4lf\n", radius); 
    return 0;  
} 

Когда я запускаю эту программу необходимо ввести значение, давайте предположим, что 100.64, нормальное поведение нажмите клавишу ввода, и программа должна продолжить и показать результат, но программа остается в ожидании для большего ввода. Если я набираю 0 и снова нажимаю клавишу, программа продолжает работать нормально.

>area.exe 
100.64 <-- doesn't proceed after press enter 
0 <-- needs input another value, then press enter 
A=31819.3103 <-- the result 

Почему scanf не работает с первым входом? Зачем это нужно?

Обс: в моей Linux это не происходит.

gcc --version 
gcc (tdm64-1) 4.9.2 
+0

Могу ли я предложить 'int main()' -> 'int main (void)'? –

+0

@SouravGhosh Почему? есть разница в этом случае? –

+2

На самом деле, более поздний из них рекомендуется стандартами 'C'. –

ответ

4

В вашем коде, измените

scanf("%lf \n", &radius); 

в

scanf("%lf", &radius); 

В противном случае, с форматной строкой, имеющий whitespace, scanf() будет вести себя, как показано ниже (цитата из C11, главы §7.21.6.2 пункта 5)

Директива, состоящая из символа (ов) белого пробела, выполняется путем считывания ввода до первого символа небелого пробела (который остается непрочитанным) или до тех пор, пока не будет прочитано больше символов.

Таким образом, чтобы обеспечить «непробельный символ» для завершения сканирования , вам нужно ввести в 0 (в основном, не-пробела).

Для получения более подробной информации, пожалуйста, проверьте man page.

+1

спасибо, очень полезно! –

0

У вас есть такое же решение для немного другой проблемы (только в типе переменного)

Why does scanf ask for input twice, but just in the first loop iteration only?

При включении пробелов в зсапе

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

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