首页 > 解决方案 > 使用指针按字母顺序对字符串数组进行排序

问题描述

我有一个项目,我必须创建一个程序,让用户以任何顺序输入姓名。然后程序按字母顺序显示名称。此外,所有这些都必须使用指针来完成。现在我对程序的尝试提示用户输入名称并显示它们,但由于某种原因我无法对其进行排序。有人可以帮帮我吗?

这是我对该程序的尝试:

#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;
}

标签: csortingpointersstring-comparison

解决方案


这里的问题是该函数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)并确保函数定义以正确的顺序编写或使用函数声明。


推荐阅读