Программа пропускает операторы if

Я написал программу с большим количеством if разделы. Написано в Visual Studio 2013 (scanf_s).
Это пропускает некоторые if разделы, хотя они встречаются. Подскажите, пожалуйста, почему?
Мое подозрение: первый scanf Команда выполнена чисто. Другой scanf Команды не работают. Я ничего не могу ввести. Программа идет строго по. Когда я вставляю fflush(stdin) между scanf Команды, это работает. Я слышал плохие вещи о fflsuh из-за этого я хочу спросить: как я могу решить это по-другому?

Вот мой код:

#include "stdafx.h"#include <stdio.h>
#include <stdlib.h>

int _tmain(int argc, _TCHAR* argv[])
{
char versand='n', stammkunde='t';
double warenwert=1;
printf("Wieviel kostet die Ware?");
scanf_s("%lf", &warenwert);
fflush(stdin);
printf("Wird die Ware abgeholt?(y,n)");
scanf_s("%c", &versand);
if (versand == 'n')
{
if (warenwert < 100)
{
warenwert = warenwert + 7;
}
printf("Expressversand?(y,n");
scanf_s("%c", &versand);
//fflush(stdin);

if (versand == 'y')
{
warenwert = warenwert + 10;
}
}
printf("Stammkunde?(y,n)");
scanf_s("%c", &stammkunde);
if (stammkunde = 'y')
{
warenwert = warenwert * 0, 97;
}
printf("Endpreis inkl. Versandkosten:%lf", warenwert);
getchar();
return 0;
}

P.S: Скриншот вывода программы здесь: http://i.gyazo.com/01471ce3d563837f526fbcab8363e1f2.png

0

Решение

printf("Wird die Ware abgeholt?(y,n)");
scanf_s("%c", &versand);

Когда вы вводите ввод и нажимаете клавишу ВВОД, символ и клавиша возврата помещаются в буфер ввода, а именно: введенный символ и символ новой строки. Символ потребляется scanf_s но символ новой строки остается во входном буфере.

В дальнейшем,

printf("Expressversand?(y,n");
scanf_s("%c", &versand);

Твой следующий scanf_s для чтения символа просто читает / потребляет символ новой строки и, следовательно, никогда не ждет ввода пользователя.

Способ 1: Решение состоит в том, чтобы использовать дополнительную новую строку, используя:

scanf_s(" %c", &versand);
^  ---- note the space!

Способ 2: Вы можете попробовать это также

fflush(stdin); // flush the stdin before scanning input!
printf("Expressversand?(y,n");
scanf_s("%c", &versand);

Исправить следующие ошибки также

printf("Stammkunde?(y,n)");
scanf_s(" %c", &stammkunde); // give space before %c
if (stammkunde == 'y') // for comparison use == not =
{
warenwert = warenwert * 0, 97;
}

Редактировать: В этом уравнении

warenwert = warenwert * 0, 97;

warenwert * 0 оценили в первую очередь, из-за высокого приоритета. так

warenwert = 0 , 97;

Вот = имеет высокий приоритет , оператор. так warenwert = 0 назначается первым. Таким образом, вы получите результат 0 всякий раз, когда это if (stammkunde = 'y') условие верно

Образец прогона 1:

sathish@ubuntu:~/c/basics$ ./a.out
Wieviel kostet die Ware?
2
Wird die Ware abgeholt?(y,n)
n
Expressversand?(y,n)
y
Stammkunde?(y,n)
n
Endpreis inkl. Versandkosten:19.000000

Прогон 2:

sathish@ubuntu:~/c/basics$ ./a.out
Wieviel kostet die Ware?
2
Wird die Ware abgeholt?(y,n)
n
Expressversand?(y,n)
y
Stammkunde?(y,n) // here your input value becomes 19, due to last condition it becomes zero!
y
Endpreis inkl. Versandkosten:0.000000
3

Другие решения

И вот приходит Способ 3 приходит:

После scanf_s что-то меняет stdin -> _ base и stdin -> _ cnt, и это вызывает эту проблему, и если вы хотите решить ее, вы можете написать std->_base="\0"; а также std->_cnt=0; после каждого раза, когда вы использовали scanf_s для чего-то. Но если вы читаете символы из строки, это может быть другая ситуация, я сказал, что для чтения одно значение переменной.

0

По вопросам рекламы [email protected]