C-код зависает во время работы - PullRequest
3 голосов
/ 14 сентября 2010

Я только начинаю изучать язык программирования Си. Я написал этот простой код, который конвертирует доллары США в евро. Единственная проблема заключается в том, что после ввода USD, программа просто зависает. Я использую цикл while, чтобы спросить пользователя, хотят ли они повторить операцию, поэтому я предполагаю, что синтаксис кода вызывает вечный цикл, но я не уверен.

Вот мой код:

#include<stdio.h>
#define conv 0.787033       //conversion factor of USD to Euro found www.ex.com//

int main(void)

{
    float USD, EURO;
    char cont = 'y';

    while (cont == 'Y' || cont == 'y')

    {
        printf("Please enter the amount of United States ");
        printf("Dollars you wish to convert to Euros\n");
        scanf("%f\n", &USD);

        EURO = USD * conv;

        printf("%.2f dollars is %.2f Euros\n", USD, EURO);
        printf("Do you wish to convert another dollar amount (Y/N)?\n");
        scanf("%c\n", &cont);
    }

    return(0);
}

Ответы [ 3 ]

12 голосов
/ 14 сентября 2010

удалите \n из вашего scanf

EDIT:

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

Один из способов избежать - использовать fgets для чтения ввода как строки, а затем извлечь то, что вы хотите, используя sscanf.

Другим способом использования новой строки будет scanf("%c%*c",&cont);. %*c будет читать новую строку из буфера и удалять ее.

C часто задаваемые вопросы о проблемах с scanf

5 голосов
/ 14 сентября 2010

Избегайте scanf ()


Лучше всего использовать fgets(3), а затем sscanf(3), поскольку интерактивная программа неизменно знает, когда ожидается строка ввода.

Итак, обычный шаблон проектирования sane-scanf делает программу немного более сложной, но также делает ее более гибкой и предсказуемой, попробуйте что-то вроде изменения ...

scanf(...)

до

char space[100];
fgets(space, sizeof space, stdin);
sscanf(space, " %f", &USD);
5 голосов
/ 14 сентября 2010

\ n внутри scanf требует, чтобы пользователь нажал еще одну клавишу «ENTER» (перевод строки), чтобы продолжить.Удалите его или несколько раз нажмите Enter, оно продолжится

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...