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