排序城市名称失败

时间:2013-09-19 09:30:56

标签: c sorting

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

输入:

Newyork
Georgetown
Berlin

输出:

Berlin
Gewyork
Beorgetown

为什么?我当时想与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;
}

3 个答案:

答案 0 :(得分: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[]);

令人惊讶的是,这甚至可以解决所有这些问题。至少你应该收到大量的警告,如果不是错误的话。

答案 1 :(得分:2)

你正在交换字符,而不是指针。你sort函数的原型同样糟糕,原因几乎相同。

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

如果您没有尝试为学术目的重新实施排序,而只是想完成排序,则应使用qsort代替。

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

答案 2 :(得分:1)

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

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

  

在main

中声明* names [3]
代码

下面

USE

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