我编写了一个程序来接受来自用户的5个字符串,然后使用冒泡排序算法按字母顺序显示它们。但是,字符串的显示顺序与输入的顺序相同。请告诉我这里我做错了什么。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void sSwap(char *s1, char *s2);
int main(){
char *sList[5],input[100],*p;
int i,j;
puts("Enter 5 strings");
for(i=0;i<5;i++){
gets(input);
sList[i] = (char *)malloc(strlen(input)+1);
strcpy(sList[i],input);
}
puts("");
for(i=3;i>=0;i--){
for(j=0;j<=i;j++){
if(strcmp(sList[j],sList[j+1])>0)
sSwap(sList[j],sList[j+1]);
}
}
for(i=0;i<5;i++)
puts(sList[i]);
return 0;
}
void sSwap(char *s1, char *s2){
char *temp;
temp = s1;
s1 = s2;
s2 = temp;
}
答案 0 :(得分:4)
正如您所知,您的交换函数获取值并按值交换它们,这意味着当您离开函数时,将不会保存更改并返回旧值。试试这个
void sSwap(char **s1, char **s2);
int main(){
char *sList[5],input[100],*p;
int i,j;
puts("Enter 5 strings");
for(i=0;i<5;i++){
gets(input);
sList[i] = (char *)malloc(strlen(input)+1);
strcpy(sList[i],input);
}
puts("");
for(i=3;i>=0;i--){
for(j=0;j<=i;j++){
if(strcmp(sList[j],sList[j+1])>0)
sSwap(&sList[j],&sList[j+1]);
}
}
for(i=0;i<5;i++)
puts(sList[i]);
return 0;
}
void sSwap(char **s1, char **s2){
char *temp;
temp = *s1;
*s1 = *s2;
*s2 = temp;
}
答案 1 :(得分:2)
你的一个问题是当你交换两个字符串时,你不会检查你是否必须将它与这个字符串的新邻居交换。
所以我会做一个递归函数来解决这个问题。就像你交换一样,你调用函数(比方说void sort(char **list, int index)
):
sort(sList, 0) //to start from beginning and check the new order
如果字符串等于或者顺序正确,例如:
sort(sList, currentListIndex);
所以你会:
void sort(char **sList, int index) {
if (sList[index+1]) {
if (strcmp(sList[index],sList[index+1]) > 0){
sSwap(sList, index); // you can swap direclty on the tab
return sort(sList, 0);
}
return sort(sList, index+1);
}
return void;
}
sort(sList, 0);
我已经有一段时间不做C所以也许指针错了,但这就是想法
答案 2 :(得分:1)
qsort函数在stdlib.h中
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
定义数组中元素的数量
#define n_array sizeof(array)/sizeof(const char *)
和比较函数
static int compare (const void * a, const void * b)
{
return strcmp (*(const char **) a, *(const char **) b);
}
然后在main中你应该使用,替换sSwap
qsort (array, n_array, sizeof (const char *), compare);