0

我想对输入的城市名称进行排序,但下面的代码给了我,例如:

输入:

纽约
乔治敦
柏林

输出:

柏林
格约克
贝尔格敦

这是为什么?我当时正在考虑与 strcmp 进行比较并交换指针,但它似乎不起作用。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void sort(char *dummy);
void swap(char *first, char *second);

int i;
char *names[3];
char *temp;

int main(void) {
    //get the names of the cities
    puts("Enter names of cities");
    for (i = 0; i < 3; i++)
    {
        names[i]=malloc(100);
        fgets( names[i], 99, stdin);
    }

    //print entered names
    for (i = 0; i < 3; i++)
    {
        printf("%s", names[i]);
    }

    sort(names);

    //print sorted names
    for (i = 0; i < 3; i++)
    {
        printf("%s", names[i]);
    }

    getch();
}

//sorting function
void sort(char *dummy)
{
    for (i = 0; i &lt; 2; i++) {
        if (strcmp( &dummy[i], &dummy[i+1]) > 0) {
            swap(&dummy[i], &dummy[i+1]);
        }
    }
}

//swapping function
void swap(char *first, char *second)
{
    temp=second;
    second=first;
    first=temp;
}
4

3 回答 3

5

当你打电话swap

swap(&dummy[i], &dummy[i+1]);

您对 address-of 运算符的使用实际上使指针指向char. 但是该swap函数需要一个指向 的指针char,这使得指针在swap未定义行为中的使用。

将函数更改为swap将指针作为参数并使用取消引用运算符*,它应该会更好地工作:

void swap(char **first, char **second)
{
    char *tmp = *first;
    *first = *second;
    *second = tmp;
}

另一个问题是您在调用时strcmp也在指针上使用了地址运算符。在这种情况下,您不应该这样做。

第三个问题是你将一个指针数组传递给sort只需要一个指针的函数char。将原型(和功能)更改为

void sort(char *dummy[]);

令人惊讶的是,它甚至可以为您编译所有这些问题。如果没有错误,至少您应该收到大量警告。

于 2013-09-19T09:33:39.553 回答
2

您正在交换字符,而不是指针。sort由于几乎相同的原因,您的功能原型同样糟糕。

PS:冒泡排序需要两个嵌套循环,而不仅仅是一个。

如果您不是为了学术目的而尝试重新实现排序,而只是想完成排序,则应该qsort改用。

否则,您必须更正您的交换功能,然后是您的排序功能。

于 2013-09-19T09:38:02.730 回答
1

你需要两个for循环而sort不是一个。您需要修改函数中的原型。

当您在 GLOBAL SCOPE 中声明时,您不需要将名称传递给函数。

在 main 中声明 *names[3]

使用下面的代码

my_sort(names);
//function call 

//defination     
void my_sort(char *dummy[]){
int i,j;
char temp[100];
for (i = 0; i < 2; i++)
for(j=i+1;j<3;j++)
     {
       if (strcmp(dummy[i],dummy[j]) >0)
         {
         strcpy(temp,dummy[i]);
         strcpy(dummy[i],dummy[j]);
         strcpy(dummy[j],temp);
         }
     }
}

或者

void my_sort(char *dummy[])
{
int i,j;
for (i = 0; i < 2; i++)
    for(j=i+1;j< 3;j++)
      if (strcmp(dummy[i],dummy[j]) >0)
          swap(&dummy[i],&dummy[j]);
}



void swap(char **first, char **second)
{
    char *tmp = *first;
    *first = *second;
    *second = tmp;
}
于 2013-09-19T09:38:43.027 回答