【发布时间】:2020-04-10 13:59:58
【问题描述】:
我有一个结构数组,其中每个对象都是具有姓名和成绩的学生,我正在尝试对这个数组进行合并排序(我想按成绩按升序对它们进行排序)。 这是学生结构:
struct Student
{
char grade[42];
char city[42];
};
grade 是一个字符,因为我通过使用 fgets 和 sscanf 从用户获取输入来分配等级值。 我认为没有必要将我的合并排序算法的整个代码放入其中,但我想分享这部分我认为可能有问题的部分?
int firstHalfSize = midElement - firstElement + 1;
int secondHalfSize = lastElement - midElement;
struct Student firstHalfArray[firstHalfSize];
struct Student secondHalfArray[secondHalfSize];
char *p;
char *s;
int index1 = 0;
int index2 = 0;
int mergedArrIndex = firstElement;
while (index1 < firstHalfSize && index2 < secondHalfSize)
{
if (strtol(firstHalfArray[index1].grade, &p, 10) <= strtol(secondHalfArray[index2].grade, &s, 10))
{
arr[mergedArrIndex] = firstHalfArray[index1];
index1++;
}
else
{
arr[mergedArrIndex] = secondHalfArray[index2];
index2++;
}
mergedArrIndex++;
}
我通过比较成绩对学生对象进行排序的部分是将char grade 转换为带有strtol 的long,我认为我做得很好,所以这可能不是问题。
我的问题是我初始化了我的结构数组,如下所示:
struct Student students[5501];
当我得到用户的新输入时,我只需将其添加到数组中,如下所示:
struct Student aStudent;
int lineCounter = 0;
students[lineCounter] = aStudent;
每次收到新输入时,lineCounter 都会增加 1。 (aStudent 在我收到新输入时更改)
这里我调用了合并排序函数,得到了奇怪的结果:
mergeSort(students, 0, 5501); // 5501 is the size of the array
printArray(students, 5501);
这里是创建的 printArray 函数,只是为了查看我是否按升序获得成绩
void printArray(struct Student A[], int size)
{
char *p;
int i;
for (i=0; i < size; i++)
printf("%ld", strtol(A[i].grade, &p, 10));
}
但我一直在打印:
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000...
我不知道为什么。
如果用户在数组students 中添加 3 个学生对象,我该怎么做
我只将它视为 3 个元素的数组而不是 5501 个元素的数组?
谢谢!对不起,如果它有点长,我真的试图简洁而不会丢失基本信息。
【问题讨论】: