我想对输入的城市名称进行排序,但是下面的代码给出了如下:
输入:
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 < 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;
}
答案 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;
}