如何使用此代码对字符串进行排序? 我在基础上失败了

我正在尝试对输入的城市名称进行排序。 下面的代码对我来说似乎是正确的,但是当它成功编译时,它不能像我预期的那样工作。

我没理解指针吗? 如果以下是真的,请让我纠正:

  1. names类型是一个字符**
  2. names[0]类型是char *
  3. 如果我想在检查strcmp()后是否更大的情况下交换字符串,我必须更改names[i]names[j]的值,因为这些值中的值是指向实际城市名称的指针。 当它们互换时,它们指向彼此的char数组,我就完成了。

如果我的第三个想法是真的,我必须将参数传递给交换函数作为char *因为交换函数将names[i]names[j]作为参数,其类型为char *。

在编写下面的代码时,思维就像上面那样。 但似乎我的逻辑失败了,因为代码不能按预期工作。

 #include  #include  #include  int i,j; char *temp; void swap(char *, char *); int main(void){ char *names[4]; //gets city names puts("Enter 4 city names:"); for (i = 0; i < 4; i++) { names[i]=malloc(100); fgets(names[i],99,stdin); } //bubble sort names array and swap if necessary for (i = 0; i < 3; i++) { for (j = i+1; j0 ) { swap(names[i], names[j]); } } } puts("Printing sorted array"); for (i = 0; i < 4; i++) { printf("%s", names[i]); } getch(); } void swap(char *first, char *second){ temp=first; first=second; second=temp; } 

您的交换function无效。 因为我觉得这对你来说并不明显,让我们尝试一个更简单的例子。

如果你想交换两个整数,你的函数将采用int而不是char* 。 你的函数是(我刚刚用int替换了char* ):

 void swap(int first, int second){ int temp=first; first=second; second=temp; } 

当使用ab 2 int变量调用swap(a,b)时,它们的值将被复制first second 。 然后你交换firstsecond变量的包含。 重要的是你不要改变原始变量ab

正确的function是:

 void swap(int *first, int *second){ int temp=*first; *first=*second; *second=temp; } 

因为这样,您传递变量的地址,并以这种方式修改原始变量。 如果不清楚,您应该记录一下指针是什么以及它是如何工作的。

现在,您可以通过char*更改int

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

您需要将指针传递给指针:

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

因为它只是修改指针的副本 ,而不是原始的。 我们使用指针来查看原始…因此你需要一个指向指针指针; 你正在修改指针!!

为了理解它,我建议将指针交换为字符串以进行整数排序。 如果它是整数你排序你的交换function将如下所示:

 void swap(int first, int second) // These ints/parameters have been copied { first = second; // This only modifies the local copy // etc.. } 

要修改原始值,您需要使用指针:

 void swap(int *first, int *second) { *first = *second; // etc... } 

您的交换函数在传递的指针上完全没有效果,您需要像这样更改它,以便修改传递的指针:

  swap(&names[i], &names[j]); void swap(char **first, char **second) { temp=*first; *first=*second; *second=temp; } 

您的交换function不正确,您无法分配这样的字符串。 你需要这样的东西(非最佳)

 void swap(char *a, char *b) { char tmp[256]; strcpy(tmp, a); strcpy(a, b); strcpy(b, tmp); } 

你的问题不是指针,而是函数调用。 将值传递给函数并修改值时,值的“源”不一定会更改。

 void swap(char **first, char **second) { char *temp; temp=*first; *first=*second; *second=temp; } swap(&names[i], &names[j]); 

或者你可以这样做:

 void swap(char **arr, int x, int y) { char *temp; temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } swap(names, i, j); 

在第一种情况下,您将两个地址传递给函数,其中的内容将被更改。 在第二个中,您传递主arrays地址和两个位置。

 #include  #include  #include  int i,j; char *temp; void swap(char **, char **); int main(void){ char *names[4]; //gets city names puts("Enter 4 city names:"); for (i = 0; i < 4; i++) { names[i]=malloc(100); fgets(names[i],99,stdin); } //bubble sort names array and swap if necessary for (i = 0; i < 3; i++) { for (j = i+1; j<4 ; j++) { if (strcmp (names[i],names[j]) >0 ) { swap(&names[i], &names[j]); } } } puts("Printing sorted array"); for (i = 0; i < 4; i++) { printf("%s", names[i]); } } void swap(char **first, char **second){ temp=*first; *first=*second; *second=temp; }