簡體   English   中英

使用指針按字母順序對字符串數組進行排序

[英]Sorting an array of strings in an alphabetical order using pointers

我有一個項目,我必須在其中創建一個程序,讓用戶以任何順序輸入名稱。 然后程序按字母順序顯示名稱。 此外,所有這些都必須使用指針來完成。 現在我對程序的嘗試提示用戶輸入名稱並顯示它們,但由於某種原因我無法對其進行排序。 有人可以幫幫我嗎?

這是我對程序的嘗試:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main() {
  int list;
  char *names[20];
  char str[20];
  printf("Enter the number of names: ");
  scanf("%d", &list);
  fflush(stdin);
  for (int i = 0; i < list; i++) {
    printf("Enter name %d: ", i + 1);
    // gets(str);
    scanf("%[^\t\n]s", str);
    fflush(stdin);
    names[i] = (char *)malloc(strlen(str) + 1);
    strcpy(names[i], str);
  }
  void sortNames();
  for (int i = 0; i < 5; i++)
    printf("%s\n", names[i]);
  return 0;
}

void sortNames(char **name, int *n) {
  int i, j;
  for (j = 0; j < *n - 1; j++) {
    for (i = 0; i < *n - 1; i++) {
      if (compareStr(name[i], name[i + 1]) > 0) {
        char *t = name[i];
        name[i] = name[i + 1];
        name[i + 1] = t;
      }
    }
  }
}

int compareStr(char *str1, char *str2) {
  while (*str1 == *str2) {
    if (*str1 == '\0' || *str2 == '\0')
      break;

    str1++;
    str2++;
  }
  if (*str1 == '\0' && *str2 == '\0')
    return 0;
  else
    return -1;
}

只關注排序的問題,主要是你永遠不會調用你后來定義的排序函數。

void sortNames();

僅用於聲明一個帶有標識符sortNames的函數,它接受任意數量的任何類型的參數(可能不是你想要做的)。 我建議修改這條線,而不是

sortNames(names, list); // Not &list because I'm about to suggest not taking it as a pointer

然后對於sortNames函數本身,我不完全清楚為什么將要排序的數組的長度作為指針而不是僅傳遞int本身。 我建議修改這個功能,而不是

void sortNames(char **name, int n) {
  int i, j;
  for (j = 0; j < n - 1; j++) {
    for (i = 0; i < n - 1; i++) {
      if (compareStr(name[i], name[i + 1]) > 0) {
        char *t = name[i];
        name[i] = name[i + 1];
        name[i + 1] = t;
      }
    }
  }
}

不過,目前存在的一個問題是表達式compareStr(name[i], name[i + 1]) > 0總是假的。 這是因為compareStr只返回 0 或 -1。 您可以通過重寫compareStr來正確處理*str1 > *str2的情況來解決此問題。 一種可能的方法是

int compareStr(char *str1, char *str2) {
    if (*str1 == '\0' && *str2 == '\0') {
        return 0;
    } else if (*str1 > *str2) {
        return 1;
    } else if (*str1 < *str2) {
        return -1;
    }
    return compareStr(str1 + 1, str2 + 1);
}

雖然如果你寫這篇文章是為了學習,我建議你嘗試修改你當前的迭代解決方案,而不是僅僅復制和粘貼這個版本。

最后,因為您想在定義它們之前使用這些函數,所以您應該在使用它們之前移動它們的定義(即,先有compareStr ,然后是sortNames ,然后是main )或在開始時提供前向聲明這些函數的文件,即添加

void sortNames(char **name, int n);
int compareStr(char *str1, char *str2);

上面你的main .


正如其他人所指出的,您可能希望避免fflush(stdin)作為其未定義的行為,我建議不要強制轉換malloc的結果

這里的問題是函數compareStr永遠不會返回大於 0 的值。它只是告訴你 2 個字符串是否相似。

對於排序,您需要添加一個額外的邏輯,如下所示:

int compareStr(char *str1, char *str2) {
    while (*str1 == *str2) {

        if (*str1 == '\0' || *str2 == '\0')
            break;

        str1++;
        str2++;
    }
    if (*str1 == '\0' && *str2 == '\0'){
        return 0;
    }
    else if(*str1 > *str2){
        return 1;
    }else{
        return -1;
    }
}

除此之外,您必須調用函數sortNames作為sortNames(names, &list)並確保以正確的順序編寫函數定義或使用函數聲明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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