[英]Sorting an Array of Strings in C using functions
#include <stdio.h>
#include <string.h>
void bubble_sort_grades(char [], int);
int main(void)
{
int menuswitch=1;
int amountofstudents;
int i;
int z;
char studentinfo[100];
char fname[50][100];
char lname[50][100];
char grade[50][100];
printf("Enter Amount of Students: ");
scanf("%d ", &amountofstudents);
for (i=0;i<amountofstudents;i++)
{
fgets(studentinfo, sizeof(studentinfo), stdin);
strcpy(fname[i], strtok(studentinfo, " "));
strcpy(lname[i], strtok(NULL, " "));
strcpy(grade[i], strtok(NULL, " "));
}
while (menuswitch==1)
{
int answer;
printf("Enter 1 for Alphabetical Sort (First Name) \n");
printf("Enter 2 for Alphabetical Sort (Last Name) \n");
printf("Enter 3 for Score Sort \n");
printf("Enter 0 to exit \n");
printf("Enter choice now: ");
scanf("%d", &answer);
if (answer==1)
{
bubble_sort_grades(grade,amountofstudents);
printf("%s\n", grade[0]);
printf("%s\n", grade[1]);
}
if (answer==2)
{
printf("In 2 \n");
}
if (answer==3)
{
printf("In 3 \n");
}
if (answer==0)
{
printf("Ending Program \n");
menuswitch=0;
}
}
}
void bubble_sort_grades(char grades2[], int amount)
{
int c, d , t;
for (c=0; c<(amount); c++)
{
for (d=0; d<amount-1; d++)
{
if (grades2[c]>grades2[d+1])
{
t=grades2[d+1];
grades2[d+1]=grades2[d];
grades2[d]=t;
}
}
}
}
很抱歉再次提出問題,但我需要氣泡排序方面的幫助。 我創建了一個功能,可以根據輸入結果對學生的成績進行泡沫排序。 但是,當我這樣做時,我只會得到第一年級而不是數組。
Input:
John Smith 86
Victor Jones 76
輸出:68 76
您在這里有兩個主要問題。
問題1:不正確的數組索引
正如@TWhite已經指出的那樣,您的冒泡排序函數的參數類型錯誤。 您已將數組聲明為char[50][100]
,這意味着它將分配50 * 100個字符作為內存中的單個大塊。 如果您的grade
內存分配在baseAddr
,那么grade[0]
在baseAddr+0
, grade[1]
在baseAddr+100
, grade[2]
在baseAddr+200
,等等。如果您不告訴bubble_sort_grades
二維數組的最后一個維度,則無法計算這些索引。 將bubble_sort_grades
的簽名更改為void bubble_sort_grades(char[][100], int)
將解決該問題。
問題2:您正在存儲C字符串,但將它們視為整數
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
。 您需要創建一個臨時緩沖區char t[100]
,然后使用strcpy
而不是通過賦值來復制內容。
我喜歡@chux關於使用struct
的建議。 使用結構具有附加的好處,當您使用=
運算符時,可以自動(正確)處理復制整個結構。 我打算提出類似的建議,並實際上建議使用內置的qsort
例程,但是我意識到這可能是家庭作業,您可能還沒有介紹結構。 在這種情況下,僅更改grade
數組以存儲int而不是c字符串可能會更容易。
一些問題
代替
char fname[50][100];
char lname[50][100];
char grade[50][100];
使用結構
typedef struct {
char fname[100];
char lname[100];
char grade[100];
} Student_t;
Student_t Student[50];
在bubble_sort_grades()
內部,使用strcmp()
比較名稱。
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);
應更改為:
void bubble_sort_grades(char *[], int);
考慮對所有數組使用char *[]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.