我的一系列结构正在打印垃圾

My array of structs is printing out garbage

本文关键字:打印 一系列 结构 我的      更新时间:2023-10-16

我正在编写一个程序,该程序使用文件I/O接收输入文件,并将数据存储在文件中。请记住,我为您提供代码的一部分。不是整个事情。我知道一切正常,因为一旦输入数据,我就会打印所有结构的阵列。打印的垃圾在我尝试对其进行分类之前发生在功能中。我试图对其进行排序的功能在我的读取文件函数中被调用,其中我打印了结构的数组。在那里,它打印完美。当它调用排序函数时,结构的数组会打印出垃圾。


这是我一直在使用的输入文件的一个示例:

### building room_number capacity 
SAL 210 30 
OHE 100 120 
OHE 120 50
### ID prefix course# sect# #minutes #mtgsperweek #students 
20001 CSCI 101 01 110 2 40 
20002 CSCI 101 02 110 2 60 
20003 CSCI 101 03 110 2 100 
20004 CSCI 103 01 90 2 50 
20005 CSCI 103 02 90 2 50 
20006 CSCI 103 03 90 2 75 
20007 CSCI 104 01 80 2 50 
20008 CSCI 104 02 80 2 50 
20009 CSCI 109 01 90 1 25 
20010 CSCI 109 02 90 1 25
20011 CSCI 109 03 90 1 25 
20012 CSCI 109 04 90 1 25 
### ID days_constraint start_constraint end_constraint 
20001 MW 1000 1400 
20002 MW 1000 1400 
20003 TR 1000 1400 
20004 TR 0800 1200
20005 TR 0800 1200 
20006 TR 0800 1200 
20007 MW 0800 1200 
20008 MW 0800 1200 
20009 M 0800 1200 
20010 M 0800 1200 
20011 T 0800 1200 
20012 T 0800 1200 

我具有一个函数,其中我使用弦乐器将数据输入并将数据输入到结构的阵列中。我知道该程序的一部分是正确的,因为之后我打印出结构的阵列,并且它们都完美地打印出来。当我调用一个新函数的新函数(在我的read_file函数中,称为sort_byclassroomsize)时,问题出现了,我试图按课堂容量按降序排序结构的数组。


这是结构:

 struct Room { 
   char building_code[4]; 
   int room_number; 
   int max_students; 
 }; 

我声明指针,然后根据用户输入的房间数量动态分配。

         struct Room* roomsPtr;
         roomsPtr = new struct Room[room_size];

room_size是对立面的计数器,计数声明房间的线数。

这是我将数据输入到结构的方式:

   if( !(line[0] == '-' && line[1] == '-') ) {
        stringstream ss;
        ss << line;
        ss >> roomsPtr[i].building_code;
        ss >> roomsPtr[i].room_number;
        ss >> roomsPtr[i].max_students;
        if( ss.fail() ) {   //checks format; terminates program if incorrect.
        cout << "The file has been formatted incorrectly." << endl;
        return;
        }
        //prints lines in section 1.
        cout << roomsPtr[i].building_code << " " << roomsPtr[i].room_number << 
            " " << roomsPtr[i].max_students << endl;

排序函数中的问题出错:

    void order_ClassroomsBySize(int num_rooms) { //arranges classrooms in descending order 
    by classroom size
         struct Room temp_value;
              //prints the array of structs before arrangement
        cout << endl;
            cout << "Arranged classrooms in descending order by classroom size: " << endl;
        for(int i = 0; i < num_rooms; i++) {
           cout << roomsPtr[i].building_code << " " << roomsPtr[i].room_number << " " 
            << roomsPtr[i].max_students;
           cout << endl;
        }
    } 
        //arranges the array of structs in descending order by classroom size
        for(int i = 0; i < num_rooms; i++) {
            for(int j = 0; j < num_rooms - 1; j++) {
                if(roomsPtr[j].max_students < roomsPtr[j+1].max_students) {
                  temp_value = roomsPtr[j];
                  roomsPtr[j] = roomsPtr[j+1];
                  roomsPtr[j+1] = temp_value;
                }
           }
        } 
        //prints the array of structs after arrangement
        cout << endl;
            cout << "Arranged classrooms in descending order by classroom size: " << endl;
        for(int i = 0; i < num_rooms; i++) {
           cout << roomsPtr[i].building_code << " " << roomsPtr[i].room_number << " " 
            << roomsPtr[i].max_students;
           cout << endl;
        }
    }

我的程序正在打印以下内容:

### building room_number capacity 
SAL 210 30 
OHE 100 120 
OHE 120 50

### ID prefix course# sect# #minutes #mtgsperweek #students 
20001 CSCI 101 01 110 2 40 
20002 CSCI 101 02 110 2 60 
20003 CSCI 101 03 110 2 100 
20004 CSCI 103 01 90 2 50 
20005 CSCI 103 02 90 2 50 
20006 CSCI 103 03 90 2 75 
20007 CSCI 104 01 80 2 50 
20008 CSCI 104 02 80 2 50 
20009 CSCI 109 01 90 1 25 
20010 CSCI 109 02 90 1 25
20011 CSCI 109 03 90 1 25 
20012 CSCI 109 04 90 1 25 
### ID days_constraint start_contsraint end_constraint 
20001 MW 1000 1400 
20002 MW 1000 1400 
20003 TR 1000 1400 
20004 TR 0800 1200
20005 TR 0800 1200 
20006 TR 0800 1200 
20007 MW 0800 1200 
20008 MW 0800 1200 
20009 M 0800 1200 
20010 M 0800 1200 
20011 T 0800 1200 
20012 T 0800 1200
Arranged classrooms in descending order by classroom size:
course# sect# #minutes OHE 593851250 1667592992
t# #minutes OHE 1970170221 544433524
OHE 120 50
Arranged classrooms in descending order by classroom size:
course# sect# #minutes OHE 593851250 1667592992
t# #minutes OHE 1970170221 544433524
OHE 120 50

像许多人一样,您在代码中使用了两个截然不同的范例:您正在使用C ,就好像是C 。正在使用C 。

愚蠢的是,如果我在C 中,我只会使用操作员过载。

这样:

class Room {
    // not generally a good idea to have public members, but if you must...
    public:
        std::string building_code;
        int room_number;
        int max_students;
        bool operator == (const Room & other) {
            if (max_students != other.max_students)
            {
                return false;
            }
            else return room_number == other.room_number && building_code == other.building_code;
        }
        bool operator < (const Room & other) {
            // returning the oposite to ensure descending order.
            return max_students > other.max_students;
        }
 };

然后,您只能将Room对象放在std::set中,该对象都可以动态地分配足够的内存,以适合您所需的所有房间,将它们以降序排序,例如:

#include <set>
std::set<Room> rooms;
room.insert( /* populate a room and put it here */);
room.insert( /* populate a room and put it here */);

,您可以像这样输出它们:

cout << "Arranged classrooms in descending order by classroom size: " << endl;
for (std::set<Room>::iterator i = rooms.begin(); i != rooms.end(); i++)
{
    cout << i->building_code << " " << i->room_number << " " 
        << i->max_students;
       cout << endl;
}

我学到的有关C 的所有内容,我可能从这里学到了。

不确定,但是问题的一部分可能是这些行:

cout << "Arranged classrooms in descending order by classroom size: " << endl;
for (std::set<Room>::iterator i = rooms.begin(); i != rooms.end(); i++)
{
    cout << i->building_code << " " << i->room_number << " " 
        << i->max_students;
       cout << endl;
}

特别是:

    cout << i->building_code << " " << i->room_number << " " 
        << i->max_students;

通过编写cout << i->building_code,您告诉cout在该char数组中打印出任何内容,即i->building_code。但是cout不知道该数组有多大,因此它不断打印出它看到的东西,直到达到无效字符(char a = 0)。这导致cout在打印内容中越过角色数组的边界。

解决此操作的方法可能是使i->building_code成为5字节数组,而不是4字节数组,而在填充结构之前将数组零零:

for (int j = 0; j < num_rooms; j++)
    for (int i = 0; i < 5; i++)
        roomPtr[j]->building_code[i] = 0;

有关更多信息,请参见此页面有关C-弦(以空字节终止的字符阵列)。

另外,此代码段:

    //arranges the array of structs in descending order by classroom size
    for(int i = 0; i < num_rooms; i++) {
        for(int j = 0; j < num_rooms - 1; j++) {
            if(roomsPtr[j].max_students < roomsPtr[j+1].max_students) {
              temp_value = roomsPtr[j];
              roomsPtr[j] = roomsPtr[j+1];
              roomsPtr[j+1] = temp_value;
            }
       }
    } 

应该看起来像这样:

   for(int i = 0; i < num_rooms - 1; i++) {
        for(int j = i + 1; j < num_rooms; j++) {
            if(roomsPtr[i].max_students < roomsPtr[j].max_students) {
              temp_value = roomsPtr[i];
              roomsPtr[i] = roomsPtr[j];
              roomsPtr[j] = temp_value;
            }
       }
    } 

如果您要选择选择排序算法(就像我认为您是)。