簡體   English   中英

使用函數對C中的字符串數組進行排序

[英]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+0grade[1]baseAddr+100grade[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM