如何在字符串(名称)中搜索结构数组并返回该字符串(名称)的信息?

时间:2014-04-17 22:18:07

标签: c++ arrays string struct

使用此程序,当我输入名称时,不会返回任何内容。

我该如何解决这个问题?

有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);
}
//  ...

2 个答案:

答案 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