我必须创建一个C ++程序,要求用户输入不同的产品信息。所以我创建了一个结构来组织产品的成员,我必须使用3个函数,1要求用户输入,1要显示输入,1要显示每个Product项的最后一个成员Count。
我的代码:
#include <iostream>
#include <string>
#include<fstream>
using namespace std;
struct Product //Structure
{
char Name[25]; //Product Name
char Type[25]; //Product Type
char Exp_Date[25]; //Product Expiration Date
double Price; //Product Price
double Discount_Percentage; //Product Discount Percentage
int Count; //Product Count in stock.
};
//Function Prototypes
Product Receive_Product_Information(Product);
void Display_All_Product_Information(Product & item);
void Display_Each_Product_Count(Product & item);
int main()
{
Product Item[2];
for (int i = 0; i < 2; i++)
{
cout << "Enter the product information for the number " << i+1 << "item" << endl;
Product item[2];
Item[i] = Receive_Product_Information(item[2]);
}
cout << "marker" << endl << endl;
for (int i = 0; i < 2; i++)
{
Product item[2];
Display_All_Product_Information(item[i]);
}
for (int i = 0; i < 2; i++)
{
Product item[2];
Display_Each_Product_Count(item[i]);
}
return 0;
}
//Function Definitions
Product Receive_Product_Information(Product item)
{
cout << "Enter Product Name: ";
cin>>item.Name;
cout << "Enter the Product Type: ";
cin>>item.Type;
cout << "Enter the Product Expiration Date: ";
cin>>item.Exp_Date;
cout << "Enter the Product Price: ";
cin >> item.Price;
cout << "Enter the Product Discount Price: ";
cin >> item.Discount_Percentage;
cout << "Enter the Product Count: ";
cin >> item.Count;
cout << endl << endl;
return item;
}
void Display_All_Product_Information(Product &item)
{
cout << "Name: " << item.Name<< endl;
cout << "Type: " << item.Type << endl;
cout << "Exp Date: " << item.Exp_Date << endl;
cout << "Price: $" << item.Price << endl;
cout << "Discount Percentage: " << item.Discount_Percentage << endl;
cout << "Count: " << item.Count << endl;
return ;
}
void Display_Each_Product_Count(Product &item)
{
cout << "Product Count: " << item.Count << endl;
return ;
}
我的问题:
我现在的问题是成员名称,类型和Exp_Date没有显示为字符串(即Apple,Fruit,December),而是我得到(## $ %%#$%$%#)
答案 0 :(得分:0)
我发现此代码存在多个问题:
for (int i = 1; i <= 2; i++)
此for
语句分别在其两次迭代中执行一个循环,i
设置为1和2。让我们记住这一点,同时检查循环的其余部分。
Product item[2];
这声明了一个包含两个Products
:item [0]和item [1]
Item[i] = Receive_Product_Information(item[i]);
此处的第一个错误是在第二次迭代中,这将引用item[2]
,因为i
将为2,见上文。
不幸的是,只存在item[0]
和item[1]
,这是未定义的行为。 item
是一个双元素数组,在两个元素数组中,您有元素#0和元素#1。不是元素#1和元素#2。
这也适用于Item
数组。它在Item
的情况下实际上更糟糕,因为它被分配给了。大多数实现的典型结果是损坏的堆栈和崩溃。
Product Receive_Product_Information(Product item)
Receive_Product_information
()函数按值接收其参数。但是,该参数是从调用者范围内的尚未初始化的本地范围对象复制而来的。从技术上讲,这不是100%的错误,但这被认为是不好的做法。参数应该通过引用传递,或者对象的内容应该正确初始化。
此外,似乎传递Product
参数并没有真正做任何事情.f。Receive_Product_Information
()似乎使用标准输入来初始化item
的内容...然后马上回来吧。那么,为什么它首先需要呢?
Receive_Product_Information
()根本不需要此参数。它只需要自己构造一个Product
的新实例,然后返回它。
此代码可能存在或可能没有其他问题,这正是我一眼就注意到的。