程序会跳过if语句

时间:2014-09-05 11:15:31

标签: c++ c if-statement fflush

我编写了一个包含很多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

2 个答案:

答案 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;为了某件事。但是如果你从字符串中读取字符,那么可能是不同的情况我说是为了读取一个变量值。