C goto循环不起作用

时间:2013-10-12 22:09:41

标签: c goto

我正在尝试学习C,并且我复制了计算增值税的代码>我将其修改为重新计算,如果用户回答是,则退出,如果答案为否。令我惊讶的是,它表现得很奇怪,如果答案是肯定的,那么它应该在开始时要求用户输入项目成本。相反,它希望在按下y之后立即输入成本。 下面的代码;

    /* VAT Calculation*/

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

float price_with_vat(float cost, float vat, int quant);

main()
{
    float cost, vat, full_price;
    int quant,count=0;
    char answer[2];
    char reply[2]={"y"};
    x:
    count=count+1;
    printf("count= %d\n",count);
    printf("Please enter the item cost:\n\n");
    scanf("%f", &cost);
    printf("\nPlease enter the quantity of product:\n");
    scanf("%d", &quant);
    printf("\nquantity=%d\n",quant);
    /* exit(0); */
    printf("\nPlease enter the VAT percentage:\n");
    scanf("%f", &vat);
    printf("\ncost=%6.2f quant=%d vat=%6.2f\n",cost, quant, vat);
    /* exit(0); */
    full_price = price_with_vat(cost, vat, quant);
    printf("The total price is %6.2f\n\n",full_price);
    printf("\nDo you want to perform another transaction? (y/n)\n");

    scanf("%c\n", &answer);
    if(answer==reply)
    {
      system("cls");
      main();
    }
    else
    return 0;
}



     float price_with_vat(float cost, float vat, int quant)


i replace the part

      if(answer==reply)
      {
          system("cls");
          main();
      }
      else

  if(answer==reply)
     goto x

我知道在C(以及Fortran)中不鼓励使用goto构造。我有一个使用do-while循环的变体。它的行为相同。 有什么想法为什么会这样? Zilore Mumba

3 个答案:

答案 0 :(得分:1)

您无法在C中将字符串与==进行比较,因此这是错误的:

if(answer==reply)

您需要使用strcmp()

if (strcmp(answer, reply) == 0)

strcmp()要求两个参数都是以空字符结尾的字符串。你永远不会向answer添加空终止符;你应该把它初始化为:

char answer[] = { '\0', '\0' };

或者,不是使用reply的字符串并回答,而是将它们声明为单个字符:

char reply = 'y';
char answer;

然后您可以使用==来比较它们。

答案 1 :(得分:1)

你的程序中有太多错误。

  1. 您使用过goto
  2. scanf("%c\n", &answer);语句中,%c需要char,但您传递char (*)[2]
  3. 您声明了char reply[2]={"y"};,这不是有效的C语法。
  4. 但是,如果reply声明为char数组,则if(answer==reply)完全错误。
  5. 结论:

    阅读关于C的好教程或阅读一本好书,了解C的基本语法。

答案 2 :(得分:1)

正如其他评论和答案中所解释的,所提供的代码存在若干问题,例如:
1) goto的使用通常是不必要的,很少使用 2) 从main()内部调用main()。错误。
3) 执行流程在程序主体内没有很好地控制,
         导致您所描述的意外行为 4) 比较技术都错了。阅读==strcmp()!=等。

以下是类似代码的示例,该代码应该更可预测地执行,说明如何与用户执行简单对话并显示结果。我希望这会对你有所帮助:)

注意:我的环境不需要我#include <conio.h>,所以我删除了它。您可能需要将其重新添加到您的环境中。

/* VAT Calculation*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

float price_with_vat(float cost, float vat, int quant);

int main(void)
{
    float cost, vat, full_price;
    int quant,count=0;
    char answer[2]={""};
    float running_total=0.0;
    count = 0;
    //dialog section of code
    while(answer[0] != 'n')
    {
    //get price, quantity and VAT
        printf("Please enter the item cost:");
        scanf("%f", &cost);
        printf("\nPlease enter the quantity:");
        scanf("%d", &quant);
        printf("\nPlease enter VAT percentage:");
        scanf("%f", &vat);
        count++;
    //results section   
        printf("\n\nCost: %6.2f\nQuantity: %d\nVAT percent: %6.2f", cost, quant, vat);
        full_price = price_with_vat(cost, vat, quant);
        running_total += full_price;
        printf("The total price is %6.2f\n\n",full_price);
        printf("\nRunning total is currently: %6.2f for %d items.\n",running_total, count);
    //request if continue
        printf("\nDo you want to perform another transaction? (enter \"y\" or \"n\")\n");
        scanf("%s", answer);
    }
    return 0;
}


float price_with_vat(float cost, float vat, int quant)
{
    return cost*((1.0)+vat)*((float)(quant));    
}