[英]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.