Я написал программу с большим количеством if
sections.It's написана с 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;
}
PS: Вывод на экран программы здесь: http://i.gyazo.com/01471ce3d563837f526fbcab8363e1f2.png
printf("Wird die Ware abgeholt?(y,n)");
scanf_s("%c", &versand);
Когда вы вводите ввод и нажимаете клавишу ENTER, символ символа и возврата помещается во входной буфер, а именно: введенный символ и символ новой строки. scanf_s
получает потребляемый scanf_s
но scanf_s
новой строки остается во входном буфере.
В дальнейшем,
printf("Expressversand?(y,n");
scanf_s("%c", &versand);
Ваш следующий scanf_s
для чтения символа просто читает/потребляет новую строку и, следовательно, никогда не ждет ввода пользователя.
Способ 1: Решение состоит в том, чтобы потреблять дополнительную строку новой строки, используя:
scanf_s(" %c", &versand);
^ ---- note the space!
Способ 2: вы можете попробовать это also-
fflush(stdin); // flush the stdin before scanning input!
printf("Expressversand?(y,n");
scanf_s("%c", &versand);
Исправьте следующие ошибки also-
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')
истинно
Пример Run1: -
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
scanf_s
требует, чтобы размер буфера был указан для параметров %c
, %s
. msdn.microsoft.com/en-us/library/w40768et.aspx
И вот приходит Путь 3:
После scanf_s он меняет stdin-> _ base и stdin-> _ cnt и вызывает эту проблему, и если вы хотите ее решить, вы можете написать std->_base="\0";
и std->_cnt=0;
после каждого раза, когда вы использовали scanf_s для чего-то. Но если вы читаете символы из строки, это может быть другая ситуация, я сказал, что для чтения одно значение переменной.
scanf_s(" %c", &versand, 1);