2016-08-19 26 views
-4

标题提到了问题。我的程序中的scanfs和/或ifs有问题(咖啡厅)

#include<stdio.h> 
#include<conio.h> 
main(){ 
char order, coffee, size, affirm; 
float price; 
clrscr(); 
printf("Hello, welcome to C Coffee Shop. How may I help you?\n"); 
printf(">Buy = B\n>Nothing = N\n"); /* Choose action */ 
scanf("%c",&order); 
if(order == 'B'){ /* Decided to buy coffee */ 
    printf("What coffee would you want for today?\n"); /* Decide coffee type */ 
    printf(">Espresso = E\n>Americano = A\n>Latte = L\n"); 
    scanf("%c",&coffee); 
    printf("How large would your drink be?\n"); /* Decide coffee size */ 
    printf(">Petite = P\n>Regular = R\n>Tall = T\n"); 
    scanf("%c",&size); 
    if((coffee == 'E') && (size == 'P')){ /* Petite Espresso */ 
    price = 35; 
    } 
    else if((coffee == 'E') && (size == 'R')){ /* Regular Espresso */ 
    price = 50; 
    } 
    else if((coffee == 'E') && (size == 'T')){ /* Tall Espresso */ 
    price = 75; 
    } 
    else if((coffee == 'A') && (size == 'P')){ /* Petite Americano */ 
    price = 45; 
    } 
    else if((coffee == 'A') && (size == 'R')){ /*Regular Americano */ 
    price = 65; 
    } 
    else if((coffee == 'A') && (size == 'T')){ /* Tall Americano */ 
    price = 90; 
    } 
    else if((coffee == 'L') && (size == 'P')){ /* Petite Latte */ 
    price = 60; 
    } 
    else if((coffee == 'L') && (size == 'R')){ /* Regular Latte */ 
    price = 85; 
    } 
    else if((coffee == 'L') && (size == 'T')){ /* Tall Latte */ 
    price = 110; 
    } 
    printf("To clarify, your order is %c %c.\nThat would be %0.2f pesos.\n", size, coffee, price); /* Verify order */ 
    printf(">OK = O\n"); /* Affirm */ 
    scanf("%c",&affirm); 
    if(affirm == 'O'){ /* Accept order */ 
    printf("Processing order...\n"); 
    } 
    else{ /* Discard order */ 
    printf("Discarding order...\n"); 
    } 
    printf("Thank you! Please come again."); 
    } 
else if(order == 'N'){ /* Decided not to buy coffee */ 
    printf("Thank you! Please come again."); 
    } 
getche(); 
return 0; 
} 

当我尝试运行该程序时,第11-16行出现没有中断,使我无法执行其他命令。我认为这是在我的scanf()或if-else语句的错误应用中。我不知道如何解决它。请帮助?

if(order == 'B'){ 
    printf("What coffee would you want for today?\n"); 
    printf(">Espresso = E\n>Americano = A\n>Latte = L\n"); 
    scanf("%c",&coffee); 
    printf("How large would your drink be?\n"); 
    printf(">Petite = P\n>Regular = R\n>Tall = T\n"); 
    scanf("%c",&size); 

另请告诉我,如果在我的代码中有任何其他错误。 Tysm那些谁可以帮助:>

+0

请给出您失败的样本输入数据。 – Shahid

+1

[Scanf在C语言中跳过每一个while循环]的可能的重复(http://stackoverflow.com/questions/1669821/scanf-skips-every-other-while-loop-in-c) – melpomene

+1

你真的应该做一个矩阵的价格... –

回答

1

只要你有一个字符输入如

scanf("%c",&coffee); 

放在格式规范前面的空间,像

scanf(" %c",&coffee); 

这将导致以往任何输入缓冲区中留有空白,例如newline之前的输入后,将被跳过,而不是被读取为char

0

当您在每个输入字符后按回车时,新行将被计为输入字符。这意味着你必须避免使用这些换行符。您可以通过以下方式执行此操作:

  • 每扫描一次后包含getchar()

  • 或者,将scanf重写为scanf("%c%*c",&order)

这是为了避免将新行字符视为输入。

+0

我其实是C的新手......感谢您的帮助! '%* c'确实有效,但它是如何工作的? 另外,如何显示他们的订单,以便当他们选择'美国高'时,下一个'printf'语句将是: '为了说明,您的订单是一个高美式。 这将是90比索.' 而不是: '为了澄清,您的订单是答: 这将是90比索。 –