2014-09-05 3 views
0

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

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

+1

можно добавить выходные данные вашей программы? – CollioTV

+1

try 'scanf_s ("% c ", & versand, 1);' – BLUEPIXY

+0

Если область действия оператора if не выполняется, условия не выполняются. Вы пытались повторить то, что получили? – bzeaman

ответ

3
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! 

Way 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: -

[email protected]:~/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 

Run 2: -

[email protected]:~/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

и сброс stdin – madduci

+0

'scanf_s' требует указать размер буфера для параметров'% c', '% s'. http://msdn.microsoft.com/en-us/library/w40768et.aspx – BLUEPIXY

+0

'fflush (stdin)' не определяется стандартами (хотя он может работать как ожидалось в большинстве систем) –

0

И здесь приходит Way 3:

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