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

0

Я написал программу с большим количеством 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

  • 1
    Можем ли мы добавить вывод вашей программы?
  • 1
    попробуйте scanf_s(" %c", &versand, 1);
Показать ещё 7 комментариев
Теги:
if-statement
fflush

2 ответа

3
Лучший ответ
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
  • 0
    и промыть стандартный
  • 0
    scanf_s требует, чтобы размер буфера был указан для параметров %c , %s . msdn.microsoft.com/en-us/library/w40768et.aspx
Показать ещё 9 комментариев
0

И вот приходит Путь 3:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню