1

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

我没有理解指针吗?如果以下情况属实,请让我更正:

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

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

在编写下面的代码时,想法就像上面一样。但似乎我的逻辑失败了,因为代码没有按预期工作。

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

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

    getch();
}

void swap(char *first, char *second){

    temp=first;
    first=second;
    second=temp;

}
4

6 回答 6

3

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

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

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

为了让您了解它,我建议您将指向字符串的指针交换为整数,然后对它们进行排序。如果它是整数,您正在对交换函数进行排序,它将如下所示:

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...
}
于 2013-09-20T09:12:19.947 回答
2

您的交换函数对传递的指针完全没有影响,您需要像这样更改它,以便修改传递的指针:

 swap(&names[i], &names[j]);


 void swap(char **first, char **second)
 {
     temp=*first;
     *first=*second;
     *second=temp;
 }
于 2013-09-20T09:12:09.053 回答
1

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

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

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

于 2013-09-20T09:26:37.983 回答
1

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

void swap(char *a, char *b) {
    char tmp[256];
    strcpy(tmp, a);
    strcpy(a, b);
    strcpy(b, tmp);
}
于 2013-09-20T09:12:37.770 回答
1

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

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

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

当您使用ab2 个int变量调用 swap(a, b) 时,它们的值将被复制firstin 中second。然后你交换变量的包含firstsecond. 重要的一点是您不要更改原始变量ab.

正确的功能是:

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

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

现在,您可以改回intby a char*

void swap(char **first, char **second){
    char* temp=*first;
    *first=*second;
    *second=temp;
}
于 2013-09-20T09:25:32.720 回答
0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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;

}
于 2013-09-20T10:44:42.447 回答