使用函数对C中的字符串数组进行排序
输出: 68 76许多问题 而不是使用函数对C中的字符串数组进行排序,c,arrays,sorting,C,Arrays,Sorting,输出: 68 76许多问题 而不是 Input: John Smith 86 Victor Jones 76 使用结构 char fname[50][100]; char lname[50][100]; char grade[50][100]; 在bubble\u sort\u grades()中,使用strcmp()比较名称 typedef struct { char fname[100]; char lname[100]; char grade[100]
Input:
John Smith 86
Victor Jones 76
使用结构
char fname[50][100];
char lname[50][100];
char grade[50][100];
在bubble\u sort\u grades()
中,使用strcmp()
比较名称
typedef struct {
char fname[100];
char lname[100];
char grade[100];
} Student_t;
Student_t Student[50];
void bubble\u sort\u分数(学生[],整数金额){
int c,d;
对于(c=0;c<(金额);c++){
对于(d=0;d0){
学生;;
t=学生[d];
学生[d+1]=学生[d];
学生[d]=t;
}
}
}
}
还有其他一些重要的问题,但这应该会让OP继续下去。有很多问题
而不是
Input:
John Smith 86
Victor Jones 76
使用结构
char fname[50][100];
char lname[50][100];
char grade[50][100];
在bubble\u sort\u grades()
中,使用strcmp()
比较名称
typedef struct {
char fname[100];
char lname[100];
char grade[100];
} Student_t;
Student_t Student[50];
void bubble\u sort\u分数(学生[],整数金额){
int c,d;
对于(c=0;c<(金额);c++){
对于(d=0;d0){
学生;;
t=学生[d];
学生[d+1]=学生[d];
学生[d]=t;
}
}
}
}
还有其他一些重要的问题,但这应该会让OP继续下去。一个问题是您的:
void bubble_sort_grades(Student_t Student[], int amount) {
int c, d;
for (c = 0; c < (amount); c++) {
for (d = 0; d < amount - 1; d++) {
if (strcmp(Student[d].grade, Student[d+1].grade) > 0) {
Student_t t;
t = Student[d];
Student[d + 1] = Student[d];
Student[d] = t;
}
}
}
}
应改为:
void bubble_sort_grades(char [], int);
考虑对所有阵列使用char*[]
。一个问题是:
void bubble_sort_grades(Student_t Student[], int amount) {
int c, d;
for (c = 0; c < (amount); c++) {
for (d = 0; d < amount - 1; d++) {
if (strcmp(Student[d].grade, Student[d+1].grade) > 0) {
Student_t t;
t = Student[d];
Student[d + 1] = Student[d];
Student[d] = t;
}
}
}
}
应改为:
void bubble_sort_grades(char [], int);
考虑对所有数组使用
char*[]
。这里有两个主要问题
问题1:数组索引不正确
正如@TWhite已经指出的,冒泡排序函数的参数类型错误。您已将数组声明为char[50][100]
类型,这意味着它将50*100个字符分配为内存中的单个大数据块。如果grade
的内存分配在baseAddr
,那么grade[0]
在baseAddr+0
,grade[1]
在baseAddr+100
,grade[2]
在baseAddr+200
,等等。如果您不告诉bubble\u sort\u grades
二维数组的最后一个维度,那么它就没有办法计算这些指数了。将bubble\u sort\u grades
的签名更改为void bubble\u sort\u grades(char[][100],int)
将解决该问题
问题2:您正在存储c字符串,但将其视为int
grade
数组是一个c字符串数组(char*
)。它存储字符,而不是整数。这意味着这一行是完全错误的:if(grades2[c]>grades2[d+1])
(旁注:注意,您使用的是c
而不是d
作为第一个索引,这也是一个错误)。如果要比较字符串,应改用strcmp
,因为比较两个char*
值只需使用
运算符进行指针比较。但是,使用strcmp要求所有等级都是2位数字(例如05
而不是5
),否则字符串“9”
将大于“80”
。由于等级是c字符串,这也意味着t=grades2[d+1]
是完全不正确的,因为您正在将char*
存储到int
中。您需要创建一个临时缓冲区chart[100]
,然后使用strcpy
而不是通过赋值复制内容
我喜欢@chux关于使用
结构的建议。当您使用=
操作符时,使用structs还具有自动(正确)处理复制整个struct的附加好处。我本来打算提出类似的建议,实际上建议使用内置的qsort
例程,但我意识到这可能是个家庭作业,您可能还没有介绍过structs。在这种情况下,只需将grade
数组更改为存储int而不是c字符串可能会更容易
问题1:数组索引不正确
正如@TWhite已经指出的,冒泡排序函数的参数类型错误。您已将数组声明为char[50][100]
类型,这意味着它将50*100个字符分配为内存中的单个大数据块。如果grade
的内存分配在baseAddr
,那么grade[0]
在baseAddr+0
,grade[1]
在baseAddr+100
,grade[2]
在baseAddr+200
,等等。如果您不告诉bubble\u sort\u grades
二维数组的最后一个维度,那么它就没有办法计算这些指数了。将bubble\u sort\u grades
的签名更改为void bubble\u sort\u grades(char[][100],int)
将解决该问题
问题2:您正在存储c字符串,但将其视为int
grade
数组是一个c字符串数组(char*
)。它存储字符,而不是整数。这意味着这一行是完全错误的:if(grades2[c]>grades2[d+1])
(旁注:注意,您使用的是c
而不是d
作为第一个索引,这也是一个错误)。如果要比较字符串,应改用strcmp
,因为比较两个char*
值只需使用
运算符进行指针比较。但是,使用strcmp要求所有等级都是2位数字(例如05
而不是5
),否则字符串“9”
将大于“80”
。由于等级是c字符串,这也意味着t=grades2[d+1]
是完全不正确的,因为您正在将char*
存储到int
中。您需要创建一个临时缓冲区chart[100]
,然后使用strcpy
而不是通过赋值复制内容