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