For 循环 c++ 的问题

issue with For loop c++

本文关键字:问题 c++ 循环 For      更新时间:2023-10-16

这段代码假设在开始和结束之间的一定范围内打印掉落的学生ID,当我运行它时,程序崩溃了。 有什么建议吗?输入是 ID 数组 [12001,12002,12003,12006]所需输出:12004 、12005//12001 和 12006 之间的丢弃 ID

void dropped_students(vector<string> students_id){
    // creating array of numbers between max and min
    int start = min_id(students_id) , end = max_id(students_id);
    vector<int> numbers;
    string diff_number;
    for (int i = start ; i <= end ; i++ )
        numbers.push_back(i);
    // finding the drooped numbers
    for (int i = 0 ; i < numbers.size(); i++){ 
        int found = 0;
        int num = atof(students_id[i].c_str());
        for (int j = 0 ; j < students_id.size() ; j++){
            int stu_id = atof(students_id[j].c_str());
            if (stu_id == num) 
                found = 1;break;
        }
        if (found == 0)
            {cout<< num << endl;}
    }       
}

你在"numbers"中的项目比在"studends"中有更多的项目,但是你使用"students_id[i]",其中"i"是"numbers"=>这超出了范围。

我认为这行

int num = atof(students_id[i].c_str());

应该是

int num = numbers[i];

我会以这种方式来优化您的函数:

  1. 按学生证的数值对数组进行排序
  2. 扫描学生阵列,定位差距并输出它们

该函数可能如下所示:

#include <algorithm>
bool CompareIDs(string students_id1, string students_id2) {
    return atoi(students_id1.c_str()) < atoi(students_id2.c_str());
}
void dropped_students(vector<string> students_id){
    // creating array of numbers between max and min
    sort(students_id.begin(), students_id.end(), CompareIDs);
    bool first = true;
    int last;
    for (auto strid : students_id) {
        int id = atoi(strid.c_str());
        if (!first) {
            if (id>last+1) 
            for (int i = last + 1; i < id; i++)
                cout << i << endl;
        }
        last = id;
        first = false;
    }
}

我用这个主要功能测试了它:

int _tmain(int argc, _TCHAR* argv[])
{
    vector<string> students_id;
    students_id.push_back("12001");
    students_id.push_back("12002");
    students_id.push_back("12003");
    students_id.push_back("12006");
    dropped_students(students_id);
}

它打印了:

12004
12005