我正在学习动态记忆,但事情并不顺利。我有一个函数接受一个数字作为输入,并且应该生成一个这样大小的数组。
class Doctor {
public:
Doctor();
void fillOut();
void listPatients();
void patientReset();
~Doctor();
private:
string name;
int numPatients;
string *patientList;
};
Doctor::Doctor() {
name = "";
numPatients = 0;
patientList = new string[numPatients];
}
(第3个代码块中最相关的代码)。
void Doctor::fillOut()
{
string buffer = "";
string buffer2 = "";
size_t found;
bool valid = false;
int numP = 0;
int tester = 0;
bool validNum = false;
while(!valid)
{
cout << "Enter doctor name: ";
getline(cin, buffer);
found = buffer.find_first_of("1234567890!@#$%^&*()-=_+/<>?;':][");
if(string::npos == found)
{
name = buffer;
valid = true;
}
}
while (!validNum)
{
cout << "\nEnter number of patients: ";
buffer = "";
getline(cin, buffer);
buffer2 = buffer;
stringstream ss(buffer);
if(ss >> tester)
{
stringstream ss2(buffer2);
ss2 >> numP;
validNum = true;
}
else
{
cout << "Not a number. Please try again." << endl;
}
}
patientList = new string[numP];
cout << patientList->size() << endl;
for(int i = 0; i < (numP + 0); i++)
{
valid = false;
while(!valid)
{
cout << "\nEnter patient " << (i + 1) << ": ";
getline(cin,buffer);
found = buffer.find_first_of("1234567890!@#$%^&*()-=_+,./<>?;':][");
if(string::npos == found)
{
*(patientList + i - 0) = buffer;
//patientList[i-1] = buffer;
valid = true;
}
else
{
valid = false;
}
}
}
}
然后我尝试显示列表的内容。
void Doctor::listPatients()
{
cout << "size: " << patientList->size() << endl;
cout << "\nDoctor: " << name << endl;
for(int i = 0; i < (patientList->size() - 1); i++)
{
cout << "Patient " << (i+1) << ": " << patientList[i] << endl;
}
cout << "end patients" << endl;
}
但由于某种原因,我提交的数字大小不是数组的大小。例如,在fillOut()
中我有函数输出大小。它每次输出的大小为0。然后在listPatients()
,我有一些东西再次打印尺寸,以验证我做得对。如果我最初输入3,则此函数中的输出为5。
我完全神秘了。
答案 0 :(得分:6)
行patientList->size()
相当于patientList[0].size()
,即patientList
数组中初始字符串的长度。刚刚分配了数组,结果总是为零;在其他情况下,它是第一个字符串的长度。
在C ++中制作容器的首选方法是std::vector
或std::array
。在您使用std::vector
的情况下更合适,因为您的代码会动态分配patientList
。
答案 1 :(得分:2)
好的,我发现了你的问题。您正在声明一个字符串数组。但是原始数组实际上只是指向数组内容的指针。当你调用 - &gt; size时,它会取消引用指针,指针指向数组中的第一个字符串并告诉你该字符串的大小。
如果您想要一个实际知道其大小的数组,请使用std :: array。
答案 2 :(得分:2)
好的,所以你将patientList声明为字符串*但是当你调用size()时,你实际上是在你创建的数组中的第一个项目上调用它。编译代码的唯一原因是因为string有一个size()函数,因为这是你的数组中包含的类型,因为patientList实际指向数组开头的项(字符串)。通常,数组没有size()函数。
你将遇到的另一个问题是你的循环
for(int i = 0; i < (patientList->size() - 1); i++) {
^
^
cout << "Patient " << (i+1) << ": " << patientList[i] << endl;
}
这会导致你的循环在结束patientList之前终止一个。你应该使用
for(int i = 0; i < patientList->size(); i++) {
cout << "Patient " << (i+1) << ": " << patientList[i] << endl;
}
你最好在这里使用std :: vector来放入你的字符串。这里也要小心
if(string::npos == found) {
*(patientList + i - 0) = buffer;
//patientList[i-1] = buffer;
valid = true;
}
else {
valid = false;
}
因为在if语句为真的情况下你只会分配给你的数组 - 当数组为假时,数组中的索引是未初始化的。老实说,我会从头开始再使用一个字符串向量。