c - 字符串数组中的冒泡排序算法运行没有错误,但不执行任何操作

标签 c bubble-sort c-strings

它应该按字母顺序对 nombres 中的 30 个名称进行排序,函数 burbuja() 执行,但完成后所有名称仍未排序

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

#define max 30

int mostrar(char nombres[max][80])
{
    int i;
    printf("\nLa pila ahora tiene los siguentes elementos\n");
    for(i = 0; i < max; i++)
        printf("%s\n",nombres[i]);
}

void burbuja(char nombres[max][80]) //part that does not work
{
    int i, j;
    char aux[80];
    for (i = 0; i < max; i++)
    {
        for (j = i + 1; j < max - i - 1; j++)
        {
            if(nombres[j - 1] > nombres[j])
            {
                strcpy(aux, nombres[j - 1]);
                strcpy(nombres[j - 1], nombres[j]);
                strcpy(nombres[j], aux);
            }
        }
    }
}

int main()
{
    char nombres[30][80] = {
        "Javier", "Paola", "Paco", "Pedro", "Jorge", "Luis", "Champ",
        "Alma", "Alicia", "Stephanie", "Mark", "Daniel", "Hank", "Malcom",
        "Jaime", "Luisa", "Lila", "Beatriz", "Teresa", "Maria", "Michel", 
        "Karina", "Karen", "Carmen", "Juan", "Daniela", "Ana", "Gavin",
        "Rosa", "Francisco"
    };

    mostrar(nombres);
    burbuja(nombres);
    mostrar(nombres);
}

它正确显示未排序的名称,气泡函数执行此操作,然后它显示所有相同的名称仍未排序

...程序已完成,退出代码为 0
按 ENTER 退出控制台

最佳答案

nombres[j - 1] > nombres[j] ,两者 nombres[j-1]nombres[j]是字符数组。数组名称本身会衰减为指向该数组第一个元素的指针。

所以通过nombres[j - 1] > nombres[j] ,您只是比较指向两个数组的第一个元素的指针。

您需要一个像 strcmp() 这样的函数.

for (j = i + 1; j < max - i - 1; j++)不会正确覆盖整个数组。

尝试类似的事情

for (i=0; i<max; i++)
{
    for (j=0; j<max-1-i; j++)
    {
        if(strcmp(nombres[j], nombres[j+1])>0)
        {
            strcpy(aux, nombres[j]);
            strcpy(nombres[j], nombres[j+1]);
            strcpy(nombres[j+1], aux);
        }
    }
}

strcmp()如果第一个字符串按字典顺序位于第二个字符串之后,则返回大于零的值。

编辑:

David C. Rankin指出,您可以将返回类型设置为 mostrar()函数为 void因为您没有返回任何值。

关于c - 字符串数组中的冒泡排序算法运行没有错误,但不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56196510/

相关文章:

java - 冒泡排序存储在 JSONArray 中的 Java 字符串

在C中将FN LN格式的字符串转换为LN,FN(John Doe到Doe,John)

python - 链接外部 C 库时来自 Cython 的 ImportError

c - 理解C中if、else if、else的控制流

c - array[i+1] 与 array[i] 具有相同的值,即使它不应该

c - 如何在函数中动态分配数组?

java - 如何对这个冒泡排序进行反向排序?

c - 0x600000000 的内存读取失败

c++ - SIGSEGV 动态分配内存接收FTP服务器的LIST响应时

c - 在 C 中打印字符串和空字符的概念