我编写了一个包含很多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 :(得分:3)
printf("Wird die Ware abgeholt?(y,n)");
scanf_s("%c", &versand);
输入输入并按ENTER键时,字符和返回键放在输入缓冲区中,它们是:输入的字符和换行符。字符被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')
示例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
答案 1 :(得分:0)
方式3 来了:
在scanf_s之后,它会改变stdin-&gt; _base和stdin-&gt; _cnt并导致该问题,如果你想解决它,你可以在每次使用scanf_s后编写std->_base="\0";
和std->_cnt=0;
为了某件事。但是如果你从字符串中读取字符,那么可能是不同的情况我说是为了读取一个变量值。