基本 C 编程:运行-Time Check Failure #3 - 变量 'pro1' 未初始化就被使用

Basic C Programming : Run-Time Check Failure #3 - The variable 'pro1' is being used without being initialized

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

Write a program to allow the user to enter code and quantity sold for 3 products (use different variables to store these 5 different product codes). Your program is required to calculate the total amount for each product (quantity x unit price) and the grand total of all products sold.

At the end, your program will display product code, product description, unit price and total amount for each product and also the grand total amount for all the products sold. Use the information on the following table as reference:

PS: you will be expected to have many variables used and many redundant of same codes appear in your program which is fine, because no looping is needed to apply here.

Extra requirements :

  1. Set the price to 2 decimal points
  2. Fix the product code using constant method.
  3. Use switch statement to get for the product price.
  4. Include 6% tax calculation in the grand total.

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

Run-Time Check Failure #3 - The variable 'pro1' is being used without being initialized.

我的回答码:

#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 语句。

初始化你的变量,

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

如果符合 default 情况,可能会在 switch 语句期间使用这些变量而未设置任何值。

你的代码有很多问题:

  1. 你违反了 DRY principle 的方式实际上被夸大了。

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

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

    您应该将它们初始化为 0,因为如果用户从未插入该值,则意味着“没有售出单位”。

  4. 您的 switch 语句 将永远不起作用 ,如果您在第二点输入 x"%d" 说明符这 4 个点中的一个将是一个问题,因为当您到达 switchcode 将未初始化,您应该改用 "%c" 说明符并检查值 returned by scanf() 以确保扫描了某些内容。

    所以不用

    scanf("%d", &code);
    

    你需要

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

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

想象一下,您所有的 switch 语句都经过了 default 案例,并且您用 pro 命中了 printf()

当然,对于未初始化的自动局部变量,先读后写的情况会导致您的应用程序 undefined behavior,因为您尝试读取的值是不确定的。

建议:始终初始化局部变量。

如果用户从未提供 x 作为代码,pro1 有什么价值?然后 pro1 永远不会被赋值——在 C 语言中这意味着当控件到达

时它是 未初始化的
subtotal = pro1 + pro2 + pro3 + pro4 + pro5;

如果打算将 0 用于未使用的产品,则应使用

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

重要提示:

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

code 必须是 int。打开编译器的所有警告!此外,你必须

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

不检查 scanf 中的 return 肯定会出人意料。