【问题标题】:Returning Employee and Salary when Given a Location Substring给定位置子字符串时返回员工和薪水
【发布时间】:2020-05-12 07:37:05
【问题描述】:

我有两个文件,一个是人名和他们来自的位置 (Evan Lloyd|Brownsville),另一个是姓名和薪水 (Evan Lloyd|58697)(您找到员工的行号在第一个文件中不一定是在第二个文件中找到员工的行号)。用户输入位置(整体或部分)。例如,如果他们输入“ville”或“Ville”,它应该包括 Brownsville、Clarksville、Greenville 等地的所有员工。如果他们在搜索的城市中,我应该加入姓名和薪水并返回他们“维尔”或“维尔”。

编译时我没有错误或警告,但我得到所有输入的分段错误。

#include <fstream>
#include <iostream>
//#include <vector>
#include <string>
#include <bits/stdc++.h>
using namespace std;

int main() {
    string str;
    cout << "Enter the location: ";
    cin >> str;
    ifstream addresses;
    addresses.open("personnel_addresses.txt");
    multimap<string, string> name_address;
    ifstream salaries;
    salaries.open("personnel_salaries.txt");
    multimap<string, string> name_salary;
    while(!addresses.eof() && !salaries.eof()) {
        string tmpstr;
        getline(addresses, tmpstr);
        int pos = tmpstr.find("|");
        string name2address = tmpstr.substr(0, pos - 1);
        string address = tmpstr.substr(pos + 1);
        name_address.insert({address, name2address});
        getline(salaries, tmpstr);
        pos = tmpstr.find("|");
        string name2employee = tmpstr.substr(0, pos - 1);
        string salary = tmpstr.substr(pos + 1);
        name_salary.insert({name2employee, salary});
    }
    // do{
    vector<string> employees;
    for(auto n = name_address.find(str); n != name_address.end(); n++) {
        employees.emplace_back(n->second);
    }
    for(int i = 0; i < sizeof(employees); i++) {
        string x = employees[i];
        //          if (name_salary.find(employees[i]))
        cout << employees[i] << ":" << name_salary.find(x)->second << "\n";
    }
    //}while(name_address.end());
    addresses.close();
    salaries.close();
    return 0;
}

有人建议我通过在 while 循环中填充一组充满城市的代码来更改代码,并在声明 vectoremployees 后立即迭代该集合,而不是通过以下代码直接在它下面的代码

for(string const& search : cities)
{
if(find(search.begin(), search.end(), str) != std::string::npos)
{
string y = search;
employees.emplace_back(y);

,但是我尝试迭代集合的语法有问题。

编辑:我的问题很简单,并通过使用 .begin() 和 .end() 迭代多映射 name_address 并使用 .substr() 查找每个名称来解决。我的while循环也不正确。我应该分别阅读每个文件。我的解决方案中没有使用向量。

while(getline(addresses, tmpstr1))
{
    int pos = tmpstr1.find("|");
    string name2address = tmpstr1.substr(0, pos);
    string address = tmpstr1.substr(pos+1);
    name_address.insert({address, name2address});
}   
while(getline(salaries, tmpstr2))
{
    int pos = tmpstr2.find("|");
    string name2employee = tmpstr2.substr(0, pos);
    string salary = tmpstr2.substr(pos+1);
    name_salary.insert({name2employee, salary});
}
  for(auto it = name_address.begin(); it != name_address.end(); ++it)
    {

        for(int i = 0; i < it->first.length(); ++i)
        {   
            string tmpstr3 = it->first.substr(0 + i, str.length());
            if(str == tmpstr3)
            {
               employees.insert(it->second);
               break;
            }
        }
    } 

【问题讨论】:

  • 如果提供代码会有所帮助。
  • 如何正确格式化它?我试图粘贴代码,但它们都在运行。
  • 将代码从 IDE 复制到问题中。选择它并使用 {} 按钮形成一个代码块
  • 我想提供帮助,但防火墙阻止我跟踪代码链接。

标签: c++ vector getline multimap


【解决方案1】:

当您尝试访问某个容量的内存,但无权访问内存中的该位置时,通常会发生分段错误。我注意到在您的最后一个 for 循环中,您说 for(int i = 0; i &lt; sizeof(employees); i++),但我相信函数 sizeof(object) 报告其参数正在消耗的内存中的字节数。这似乎不是您想要的,并且字节数很可能比您正在跟踪的员工数量大得多。因此,您的 for 循环体将尝试访问不允许访问的内存,然后提示分段错误。

另一个简短的笔记:

  1. 您是否保证两个输入文件都包含有关相同数量员工的信息?如果没有,由于您的循环条件,您将退出 both 个文件的读取,因为您将在其中的 一个 文件结束后立即退出。

    李>
  2. 在大多数情况下,我认为ifstream::eof() 非常危险,因为它仅表明您是否尝试读取文件末尾。这通常意味着您将执行比预期更多的操作。 See here 如果您想从比我更有知识的人那里获得更多信息。

【讨论】:

    猜你喜欢
    • 2018-05-06
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    相关资源
    最近更新 更多