C 如何使用此代码对字符串进行排序?我基本功不及格

C 如何使用此代码对字符串进行排序?我基本功不及格,c,C,我正在尝试对输入的城市名称进行排序。下面的代码对我来说似乎是正确的,但尽管它确实成功编译了,但它并没有像我预期的那样工作 我理解指针失败了吗?如果以下是正确的,请允许我更正: 名称类型是字符** 名称[0]类型为字符* 如果我想在使用strcmp检查字符串是否较大后交换字符串,我必须更改名称[I]和名称[j]中的值,因为这些值中的值是指向实际城市名称的指针。当这些字符互换时,它们指向彼此的字符数组,我就完成了。 如果我的第三个想法是正确的,我必须将参数作为char*传递给swap函数,因为swa

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

我理解指针失败了吗?如果以下是正确的,请允许我更正:

名称类型是字符** 名称[0]类型为字符* 如果我想在使用strcmp检查字符串是否较大后交换字符串,我必须更改名称[I]和名称[j]中的值,因为这些值中的值是指向实际城市名称的指针。当这些字符互换时,它们指向彼此的字符数组,我就完成了。 如果我的第三个想法是正确的,我必须将参数作为char*传递给swap函数,因为swap函数将名称[I]和名称[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;

}

您的swap函数对传递的指针没有任何影响,您需要这样更改它,以便修改传递的指针:

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


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

您的swap函数对传递的指针没有任何影响,您需要这样更改它,以便修改传递的指针:

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


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

您需要向指针传递一个指针:

void swap(char **first, char **second)
{
    char *temp = *first;
    *first = *second;
    *second = temp;
}
实际上,您只是修改指针的副本,而不是原始指针。我们使用指针来查看原始…因此您需要指向指针的指针;您正在修改指针

为了让您了解它,我建议您将字符串指针替换为int,并对其进行排序。如果是ints,则对交换函数进行排序时会显示如下:

void swap(int first, int second) // These ints/parameters have been copied
{
    first = second; // This only modifies the local copy
    // etc..
}
void swap(char **arr, int x, int y) {
    char *temp;
    temp = arr[x];
    arr[x] = arr[y];
    arr[y] = temp;
}

swap(names, i, j);
要修改原始值,需要使用指针:

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

您需要向指针传递一个指针:

void swap(char **first, char **second)
{
    char *temp = *first;
    *first = *second;
    *second = temp;
}
实际上,您只是修改指针的副本,而不是原始指针。我们使用指针来查看原始…因此您需要指向指针的指针;您正在修改指针

为了让您了解它,我建议您将字符串指针替换为int,并对其进行排序。如果是ints,则对交换函数进行排序时会显示如下:

void swap(int first, int second) // These ints/parameters have been copied
{
    first = second; // This only modifies the local copy
    // etc..
}
void swap(char **arr, int x, int y) {
    char *temp;
    temp = arr[x];
    arr[x] = arr[y];
    arr[y] = temp;
}

swap(names, i, j);
要修改原始值,需要使用指针:

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

您的交换函数不正确,无法分配这样的字符串。你需要像这样的非最优的东西

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

您的交换函数不正确,无法分配这样的字符串。你需要像这样的非最优的东西

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

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

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

当您使用a和b2 int变量调用swapa、b时,它们的值被复制到first in second中。然后交换第一个和第二个变量的包含。重要的一点是,您不需要更改原始变量a和b

正确的功能是:

void swap(int *first, int *second){
    int temp=*first;
    *first=*second;
    *second=temp;
}
因为这样,您可以传递变量的地址,并以这种方式修改原始变量。如果不清楚,您应该记录什么是指针以及它是如何工作的

现在,您可以通过char*将int改回:


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

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

当您使用a和b2 int变量调用swapa、b时,它们的值被复制到first in second中。然后交换第一个和第二个变量的包含。重要的一点是,您不需要更改原始变量a和b

正确的功能是:

void swap(int *first, int *second){
    int temp=*first;
    *first=*second;
    *second=temp;
}
因为这样,您可以传递变量的地址,并以这种方式修改原始变量。如果不清楚,您应该记录什么是指针以及它是如何工作的

现在,您可以通过char*将int改回:


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

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

swap(&names[i], &names[j]);
或者你可以这样做:

void swap(int first, int second) // These ints/parameters have been copied
{
    first = second; // This only modifies the local copy
    // etc..
}
void swap(char **arr, int x, int y) {
    char *temp;
    temp = arr[x];
    arr[x] = arr[y];
    arr[y] = temp;
}

swap(names, i, j);

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

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

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

swap(&names[i], &names[j]);
#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;

}
或者你可以这样做:

void swap(int first, int second) // These ints/parameters have been copied
{
    first = second; // This only modifies the local copy
    // etc..
}
void swap(char **arr, int x, int y) {
    char *temp;
    temp = arr[x];
    arr[x] = arr[y];
    arr[y] = temp;
}

swap(names, i, j);

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

另外,冒泡排序基本上就是魔鬼。你需要传递一个指向指针的指针:你能解释一下吗
#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;

}


再进一步,为什么?我在这方面遗漏了一些要点。请使用ints添加更多解释。一旦你明白你需要在你的思维中用char*替换int,因此一个指向指针的指针。。。指向char*names[0]类型的指针为char*是否为真?正确!为了使事情变得混乱,可以将字符串定义为chars char MyString[100]数组或指针char*PointyString=Hi。您拥有的是一个char*数组:一个字符串数组,然后分配并从流中读取。此外,冒泡排序基本上是一个魔鬼。您需要向指针传递一个指针:您能进一步解释一下为什么吗?我在这方面遗漏了一些要点。请使用ints添加更多解释。一旦你明白你需要在你的思维中用char*替换int,因此一个指向指针的指针。。。指向char*names[0]类型的指针为char*是否为真?正确!为了使事情变得混乱,可以将字符串定义为chars char MyString[100]数组或指针char*PointyString=Hi。您拥有的是一个char*数组:一个字符串数组,然后分配并从流中读取。我是否应该更改名称[I]和名称[j]的内容,而不是它们的地址?为什么必须将地址传递给函数?请解释一下。这是我不明白的一点。+1,可能在swap中声明temp以减少混乱。我不应该更改名称[I]和名称[j]的内容而不是它们的地址吗?为什么必须将地址传递给函数?请解释一下。这是我不明白的一点。+1,可能temp可以在swap中声明以减少混乱。这应该可以工作,但他想交换指针。这不仅更快而且更安全,如果有人因为这个原因更改了字符串的长度或来源,那么使用strncpy或实现边界检查也会更明智。@lserni我再次给出了红色答案,仍然没有看到显式提示,而OP希望交换指针,而不是数组内容。当然,我必须同意,大多数情况下,您的版本会更快,但这取决于位置和实际大小,而数组大小是硬编码来处理这个特定示例的。但是我强烈不同意strncpy-这个函数会在你最不期待的时候击中你的头部。我的意思是,如果大小不够,它将忽略\0,而如果字符串较短,它将用零填充剩余的大小-开销!。strlcpy好得多,但不标准。这应该行得通,但他想交换指针。这不仅更快而且更安全,如果有人因为这个原因更改了字符串的长度或来源,那么使用strncpy或实现边界检查也会更明智。@lserni我再次给出了红色答案,仍然没有看到显式提示,而OP希望交换指针,而不是数组内容。当然,我必须同意,大多数情况下,您的版本会更快,但这取决于位置和实际大小,而数组大小是硬编码来处理这个特定示例的。但是我强烈不同意strncpy-这个函数会在你最不期待的时候击中你的头部。我的意思是,如果大小不够,它将忽略\0,而如果字符串较短,它将用零填充剩余的大小-开销!。strlcpy好得多,但不标准。谢谢你的回答。谢谢你的回答。非常感谢你的回答。帮了我。非常感谢你的回答。帮助了我。