基本C编程:运行时检查失败#3 - 正在使用变量'pro1'而未初始化

时间:2015-10-07 08:17:05

标签: c initialization

我是计算机科学的新手,我目前正在大学读第一年。 今天遇到一个问题我有问题。 问题是:

  

编写程序以允许用户输入3种产品的销售代码和数量(使用不同的变量来存储这5种不同的产品代码)。您的计划需要计算每种产品的总金额(数量x单价)和所有销售产品的总计。

     

最后,您的程序将显示每种产品的产品代码,产品描述,单价和总金额,以及所有销售产品的总金额。使用下表中的信息作为参考:

     

Table Reference

     

PS:您需要使用许多变量,并且程序中会出现许多相同代码的冗余,这很好,因为这里不需要循环。

     

额外要求:

     
      
  1. 将价格设为2位小数
  2.   
  3. 使用常量方法修复产品代码。
  4.   
  5. 使用switch语句获取产品价格。
  6.   
  7. 在总计中包含6%的税额计算。
  8.   

这是我的答案,在编译代码时运行没有错误,但是当我尝试运行它时,它有问题:

  

运行时检查失败#3 - 正在使用变量'pro1'而未初始化。

我的回答代码:

#include <stdio.h>
int main()
{
float pro1, pro2, pro3, pro4, pro5;
float subtotal, Tax, total;
int unit;
char code;
int x, y, z, a, b;

printf("Enter the quantity of the product.\n");
scanf("%d", &unit);
printf("Enter the product code.(x=12345,y=56789,z=45678,a=13579,b=34567)\n");
scanf("%d", &code);

switch (code)
{
case 'x':
    pro1 = unit*3.50;
    break;
case 'y':
    pro2 = unit*3.50;
    break;
case 'z':
    pro3 = unit*1.20;
    break;
case 'a':
    pro4 = unit*4.50;
    break;
case 'b':
    pro5 = unit*1.00;
    break;
default:
    printf("Invalid code.\n");
    break;
}

printf("Enter the quantity of the product.\n");
scanf("%d", &unit);
printf("Enter the product code.(x=12345,y=56789,z=45678,a=13579,b=34567)\n");
scanf("%d", &code);

switch (code)
{
case 'x':
    pro1 = unit*3.50;
    break;
case 'y':
    pro2 = unit*3.50;
    break;
case 'z':
    pro3 = unit*1.20;
    break;
case 'a':
    pro4 = unit*4.50;
    break;
case 'b':
    pro5 = unit*1.00;
    break;
default:
    printf("Invalid code.\n");
    break;
}

printf("Enter the quantity of the product.\n");
scanf("%d", &unit);
printf("Enter the product code.(x=12345,y=56789,z=45678,a=13579,b=34567)\n");
scanf("%d", &code);

switch (code)
{
case 'x':
    pro1 = unit*3.50;
    break;
case 'y':
    pro2 = unit*3.50;
    break;
case 'z':
    pro3 = unit*1.20;
    break;
case 'a':
    pro4 = unit*4.50;
    break;
case 'b':
    pro5 = unit*1.00;
    break;
default:
    printf("Invalid code.\n");
    break;
}

printf("Enter the quantity of the product.\n");
scanf("%d", &unit);
printf("Enter the product code.(x=12345,y=56789,z=45678,a=13579,b=34567)\n");
scanf("%d", &code);

switch (code)
{
case 'x':
    pro1 = unit*3.50;
    break;
case 'y':
    pro2 = unit*3.50;
    break;
case 'z':
    pro3 = unit*1.20;
    break;
case 'a':
    pro4 = unit*4.50;
    break;
case 'b':
    pro5 = unit*1.00;
    break;
default:
    printf("Invalid code.\n");
    break;
}

printf("Enter the quantity of the product.\n");
scanf("%d", &unit);
printf("Enter the product code.(x=12345,y=56789,z=45678,a=13579,b=34567)\n");
scanf("%d", &code);

switch (code)
{
case 'x':
    pro1 = unit*3.50;
    break;
case 'y':
    pro2 = unit*3.50;
    break;
case 'z':
    pro3 = unit*1.20;
    break;
case 'a':
    pro4 = unit*4.50;
    break;
case 'b':
    pro5 = unit*1.00;
    break;
default:
    printf("Invalid code.\n");
    break;
}

printf("Artline 500A Black (Whiteboard Marker): %f", pro1);
printf("Artline 500A Red (Whiteboard Marker): %f", pro2);
printf("Pocket File (Yellow): %f", pro3);
printf("Pencil Casing: RM %f", pro4);
printf("A4 Exercise Book: %f", pro5);

subtotal = pro1 + pro2 + pro3 + pro4 + pro5;
Tax = subtotal*0.06;
total = subtotal + Tax;

printf("Subtotal : %f", subtotal);
printf("Tax : %f", Tax);
printf("Total : %f", total);

system("pause");
return 0;

}

到目前为止,我只学习了基本的I / O操作,if-else语句和switch case语句。

4 个答案:

答案 0 :(得分:1)

想象一下,您的所有switch语句都会通过default个案,然后点击printf()pro

当然,未初始化的自动局部变量的写入前读取方案将导致应用程序中出现undefined behavior,因为您尝试阅读的值不确定。

建议:始终初始化本地变量。

答案 1 :(得分:1)

如果用户从未将pro1作为代码,那么x的值是多少?然后pro1永远不会被分配一个值 - 当C lingo表示当控件到达时未初始化

subtotal = pro1 + pro2 + pro3 + pro4 + pro5;

如果意图对未使用的产品使用0,则应使用

初始化它们
float pro1 = 0, pro2 = 0, pro3 = 0, pro4 = 0, pro5 = 0;

重要提示:

还有另一个错误
char code;
scanf("%d", &code);
如果您使用code格式进行扫描,则

int必须为%d。打开编译器的所有警告!此外,您必须使用

测试scanf的返回
if (scanf("%d", &code) != 1) {
    /* error: could not convert the input to a number. */
}

不检查来自scanf的回报确实是令人惊讶的秘诀。

答案 2 :(得分:0)

初始化变量,

float pro1=0, pro2=0, pro3=0, pro4=0, pro5=0;

如果switch语句落在default语句中,则可能会使用这些变量而没有设置任何值。

答案 3 :(得分:0)

您的代码存在许多问题:

  1. 您违反DRY principle的方式实际上已被宣传。

  2. 您永远不会检查scanf()的返回值,这可能会导致变量保持其先前的值或在您使用时未初始化。

  3. 您打印probN变量的值,但可能会发生用户从未输入N产品的代码。

    您应该将它们初始化为0,因为如果用户从未插入该值,则表示&#34; 无单位&#34;被卖了。

  4. 如果您使用switch说明符输入x,则"%d"语句将永远不会有效,这4点的第二点将是问题是因为当您到达codeswitch将被取消初始化,您应该使用"%c"说明符,并检查scanf()返回的值,以确保扫描了某些内容。

    所以而不是

    scanf("%d", &code);
    

    你需要

    if (scanf(" %c", &code) != 1)
        wow_this_is_really_unexpected_but_I_am_glad_to_be_careful();
    

    使用char *说明符时传递"%d"也是错误的,而且它实际上是一个严重的错误。