使用此程序,当我输入名称时,不会返回任何内容。
我该如何解决这个问题?
有1000行信息如下:
114680858 19670607 Matilda Vincent MI
114930037 19471024 Desdemona Hanover ID
115550206 19790110 Xanadu Perlman ND
116520629 19630921 Alexander Hall SD
117050976 19301016 David Lamprey GA
119610646 19650202 Thomas Porlock IL
120330928 19621126 Cary Cartman NC
等......
代码:
struct employees
{
int ss_number;//social security
int dob;//date of birth YYYY/MM/DD Ex.) 19870314=1987/03/14
string f_name;
string l_name;
string state; //state of residence
};
void read_file()//read file into array of 1000 structs
{
ifstream data("/home/www/class/een118/labs/database1.txt");
employees array[1000]
if(!data.fail())
{
int i;
for(int i=0;i<1000;i++)
{
data>>array[i].ss_number
>>array[i].dob
>>array[i].f_name
>>array[i].l_name
>>array[i].state;
}
for(int i=0;i<1000;i++)
{
cout<<array[i].ss_number>>" "<<array[i].dob>>" "<<array[i].f_name>>" "<<
array[i].l_name>>" "<<array[i].state;
}
}
}
void print_person(employees e)
{
cout<<e.ss_number>>" "<<e.dob>>" "<<e.f_name>>" "<<e.l_name>>" "<<e.state;
}
void search(employees array[])//type in name and get that persons ss_number,dob etc...
{
string first;
string last;
cout<<"Enter name";
cin>>first>>last;
for(int i=0;i<1000;i++)
{
if(array[i].f_name==first && array[i].l_name==last)
{
print_person(array[i]);
}
}
}
void main()
{
employees array[10];
read_file();
search(array);
}
// ...
答案 0 :(得分:0)
在search
函数中,不应使用相等比较
if (array[i].f_name==first)
您应该使用std::string::compare
if (array[i].f_name.compare(first) == 0)
这将以与您期望==
相同的方式返回True。
答案 1 :(得分:0)
有两个数组。一个在main
,另一个在read_file
。它们具有相同的名称,但大小不同。
read_file
中的数组与main
中的数组没有关系。您已将数组传递给search
,但未传递给read_file
。我建议您通过引用将数组传递给read_file
并删除read_file
中的数组声明。
更好的是,消除数组并使用std::vector
。它将是std::vector<employees>
。
编辑1:搜索阵列
在search
函数中,您需要传递两个附加参数:数组容量和数组中的记录数。如果您使用std::vector<employees>
,则可以通过以下方式获取阵列中的员工数量:
number_of_employees = array.size();
for
循环将使用迭代器:
std::vector<employees>::const_iterator iter;
for (iter = array.begin(); iter != array.end(); ++iter)
{
// process array slot by dereferencing it:
employee e = *iter;
cout << e << "\n"; // This could happen if you overloaded operator <<
}
否则,对于数组,您的循环将如下所示:
void search(employees array[], unsigned int capacity, unsigned int employees_in_array)
{
for (unsigned int i = 0; i < employees_in_array; ++i)
{
cout << array[i];
}
}
一个很好的改进是这个搜索功能不会硬编码大小。因此,您可以在不修改main
功能的情况下将大小从10(search
)更改为1000。
如果您对容器进行排序,则可以使用二进制搜索
请参阅:std::binary_search, std::find, std::lower_bound, std::upper_bound