当我尝试运行代码时,它会要求输入第一个输入,但接下来它会显示转储的核心。
我有些疑惑,我怎样才能纠正这些警告?
如果可以优化此代码,请告诉我,我正在尝试制作 高效代码:D
编译:
g ++ -O2 -Wall Proy2.cpp -o Proy2
代码:
#include < cstdio >
#include < iostream >
using namespace std;
int main(){
typedef struct PC{
char Brand[20];
char Model[20];
char Serial[20];
char Processor[10];
};
PC PC1[5],*machine;
unsigned int i;
for(i = 0; i < 4; i++){
cout <<"Insert PC brand: ";
fgets(machine->Brand, 20, stdin); fflush(stdin);
cout <<"Insert PC model: ";
fgets(machine->Model, 20, stdin); fflush(stdin);
cout <<"Insert PC serial: ";
fgets(machine->Serial, 20, stdin); fflush(stdin);
cout <<"Insert PC processor: ";
fgets(machine->Processor, 10, stdin); fflush(stdin);
printf("PC Brand : %s", PC1[i].Brand);
printf("PC Model : %s", PC1[i].Model);
printf("PC Serial : %s", PC1[i].Serial);
printf("PC Processor: %s", PC1[i].Processor);
PC1[i] = *machine;
}
return 0;
}
答案 0 :(得分:1)
cout
是C ++,printf
是C. fgets
也是C,应该是getline
(C ++)。你必须选择语言,而不是两者兼而有之。 Char*
是C,string
是C ++
您的课程或结构不应该在您的主要
中#include <cstdio>
#include <iostream>
using namespace std;
typedef struct PC{
string Brand;
string Model;
string Serial;
string Processor;
};
int main(){
PC *PC1[5]; // pointer of pointers
PC *machine=new PC[4];
unsigned int i;
for(i = 0; i < 4; i++){
cout <<"Insert PC brand: ";
cin >> machine->Brand;
cout <<"Insert PC model: ";
cin >> machine->Model;
cout <<"Insert PC serial: ";
cin >> machine->Serial;
cout <<"Insert PC processor: ";
cin >> machine->Processor;
PC1[i] = machine; // you store the machine in PC1
cout << "PC Brand : " << PC1[i]->Brand << endl;
cout << "PC Model : " <<PC1[i]->Model << endl;
cout << "PC Serial : " <<PC1[i]->Serial << endl;
cout << "PC Processor: " <<PC1[i]->Processor << endl;
}
return 0;
}
您使用PC1[5]
并且在循环中您只提供4个元素(0到3是4个元素)。我想改变你的循环
答案 1 :(得分:1)
您定义了两个变量
PC PC1 [5],*机器;
意味着
PC1是大小为5的数组,每个元素都是PC(每个元素都已经用默认的ctor初始化)
机器是ptr到PC,未初始化而未分配
然后你在机器上存储
fgets(machine-&gt; Brand,20,stdin)
并在机器未初始化时获取核心转储
可能你现在正在猜测解决方案 这是初始化机器
在分配任何内容之前,如下面的内部循环machine =&amp; PC1 [i];
顺便说一句,在定义struct / class时,C ++中不需要typedef,因为它是自动类型化的
答案 2 :(得分:0)
在这里打印未初始化的变量:
printf("PC Brand : %s", PC1[i].Brand);
以及以下几行。您从未将任何数据写入PC1[i]
。相反,您将数据写入您new
并且指向machine
的对象中。
稍后您就行:
PC1[i] = *machine;
我猜你的意思是该行在printf
行之前。
请注意,无需使用动态分配。您可以改为编写PC machine;
。事实上,您可以直接阅读PC1[i]
,甚至根本没有machine
。