使用指针按字母顺序对字符串数组进行排序

在水里

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

这是我对程序的尝试:

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

虽然如果你写这篇文章是为了学习,我建议你尝试修改你当前的迭代解决方案,而不是仅仅复制和粘贴这个版本。

最后,因为您想在定义它们之前使用这些函数,所以应该在使用它们之前移动它们的定义(即 have compareStr、 thensortNames和 then main)或在文件的开头为这些函数提供前向声明功能,即添加

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

在您的main.


正如其他人所指出的,您可能希望避免fflush(stdin)其未定义的行为,我建议不要malloc.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用指针数组按字母顺序对字符串进行排序

按字母顺序对C字符串数组进行排序

如何使用角度orderBy过滤器按字母顺序对字符串数组进行排序?

如何使用基于域的列表按字母顺序对字符串数组进行排序

尝试使用冒泡排序按字母顺序对字符串数组进行排序,但排序返回数组的反向

按字母顺序,数字顺序和特殊字符对字符串数组进行排序

在字符串中按字母顺序对字符进行排序

如何按字母顺序对字符串的ArrayList进行排序?

如何按字母顺序对字符串进行排序

Visual Basic字符串数组按字母顺序排序

如何使用sql按字符串排序的字母顺序对单词进行排序

如何根据名称和查询字符串按字母顺序对对象数组进行排序?

如何按字母顺序对字符串数组进行排序并防止c中的突变

如何按字母顺序对记录名称为:字符串字段的记录数组进行排序?

如何在Java中按字母顺序对字符串数组进行排序?

按字母顺序对字符串数组进行排序 C++

通过在c中按字母顺序对2d字符串数组进行排序

按字母顺序对字符串数组进行排序 - C++ 11

Ruby:按字母顺序对字符串数组进行排序,其中包括一些字符串数组

使用函数按字母顺序对字符串排序

使用与原始数组中相同的顺序绘制具有字符串数组的x轴,而不是在matplotlib中按字母顺序对其进行排序

如何按字母顺序对由逗号分隔的字符串进行排序,并按成员的姓氏按字母顺序进行排序?

在不使用内置 sort() 的情况下按字母顺序对字符串中的字母进行排序

C#按字母顺序对字符串数组进行排序,注意将以大写字母开头的字符串放在首位。第一

如何在Python中按字母顺序对字符串中的字母进行排序

Python:如何按字母顺序对字符串中的字母进行排序,以区分大写和小写

在PostgreSQL中按字母顺序对字符串中的字母进行排序

按字母顺序对字符串变量中的字母进行排序

如何使用特定字母对字符串数组进行排序?