Почему scanf изменяет порядок выполнения? - PullRequest
1 голос
/ 05 сентября 2011

Я фиксирую некоторый пользовательский ввод и сохраняю его как в struct, так и в файл.

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

Программа работает нормально, но только на одном компьютере один scanf выполняется до соответствующего printf.

Вот суть проблемы:

printf("\n color: ");
scanf("%s",&robot1.color);
fputs(robot1.color, f);
fputs("\n",f);

printf("\n energy: ");
scanf("%d",&robot1.energy);
fprintf(f,"%d",robot1.energy);
fputs("\n",f);

printf("\n height: ");
scanf("%f",&robot1.height);
fprintf(f,"%.2f",robot1.height);
fputs("\n",f);

printf("\n weight: ");
scanf("%f",&robot1.weight);
fprintf(f,"%.2f",robot1.weight);
fputs("\n",f);

Я тестировал его на двух компьютерах с Windows, используя Dev-C ++ , и на Mac, используя GCC. Одна из машин Windows - та, которая вызывает весь этот беспорядок.

Правильное выполнение (включая пользовательский ввод):

color: red
energy: 100
height: 30.5
weight: 500.0

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

color: red
energy: 100
30.5
height:
weight: 500.0

Файл записан правильно во всех случаях, поэтому, почему только один компьютер имеет проблемы с scanf и printf?

Определение структуры:

typedef struct roboto
{
    char name[10];
    char color[10];
    int energy; 
    float height;
    float weight; 
}robot;

Ответы [ 3 ]

4 голосов
/ 05 сентября 2011

Я предполагаю, что проблема в том, что stdout не сбрасывается до того, как пользователю будет предложено ввести данные. Чтобы это исправить, вы можете попробовать сбросить стандартный вывод после каждого оператора печати, используя fflush(stdout);. Например:

printf("\n color: ");
fflush(stdout);
scanf("%s",&robot1.color);
fputs(robot1.color, f);
fputs("\n",f);
3 голосов
/ 05 сентября 2011

Стандартный вывод буферизован, поэтому вы не можете быть уверены, когда он будет записан. Вызовите fflush(stdout), чтобы принудительно записать вывод после вызова printf, тогда вы можете быть уверены, что вывод будет записан.

0 голосов
/ 16 июня 2012

Может быть, проверка возвращаемого значения из scanf даст вам некоторые подсказки.Игнорирование этого значения просто напрашивается на неприятности.

...