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

4

2 回答 2

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')条件为真

样品运行 1: -

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
于 2014-09-05T11:18:17.173 回答
0

方式 3来了:

在 scanf_s 之后,它会更改 stdin->_base 和 stdin->_cnt 并导致该问题,如果您想解决它,您可以在每次使用 scanf_s 后std->_base="\0";编写。std->_cnt=0;但是,如果您从字符串中读取字符,则情况可能会有所不同,我说过要读取一个变量值。

于 2014-09-05T12:49:27.823 回答