对C中的字符串数组进行冒泡排序

问题描述 投票:1回答:2

我一直在尝试对字符串数组进行冒泡排序,但始终会收到“细分错误”错误。任何帮助表示赞赏。

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

int main()
{
char *arreglo[20]={"Ruben","Modesta","Jan","Ana","Amparo","Josu","Azahara","Concepcio","Carmelo","Miguel","Francesc","Jairo","Jose","Luis","Teo","Jone","Jacobo","Ainoa","Natalia","Igor"};
int i;
int j;
char *temp;


for (int j=0; j<20; j++) 
{ 
    for (int i=j+1; i<20; i++) 
    { 
        if (strcmp(arreglo[j], arreglo[i]) > 0) 
        { 
            strcpy(temp, arreglo[j]); 
            strcpy(arreglo[j], arreglo[i]); 
            strcpy(arreglo[i], temp); 
        } 
    } 
} 

}

c bubble-sort
2个回答
0
投票

当声明指向数组的指针 char并初始化每个指向字符串的指针时,这些字符串中的每个都是String Literal,并且不能修改(很少有例外)。为了交换字符串,每个字符串必须驻留在可以修改的内存中,例如数组或在分配的内存块中。

您情况下的简单解决方案是将arreglo设为2D数组,而不是point-of-pointers,例如char arreglo[20][20]。您的另一个选择是将arreglo保留为poiners数组,然后为每个指针分配存储空间,然后在排序之前将名称复制到每个分配的块中(有点儿麻烦)。

您对temp有相同的问题。您将temp声明为指针,但是在尝试在交换例程中使用它之前,并未将其初始化为指向任何有效的存储。对于您的数据,它也可以简单地是char temp[20];(尽管您只需要在if语句中声明它)

进行这些更改并稍微调整排序限制,您可以这样做:

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

int main (void) {

    char arreglo[20][20] = {"Ruben", "Modesta", "Jan", "Ana", "Amparo", "Josu", 
                            "Azahara", "Concepcio", "Carmelo", "Miguel", "Francesc",
                            "Jairo", "Jose", "Luis", "Teo", "Jone", "Jacobo", 
                            "Ainoa", "Natalia", "Igor"};

    for (int j = 0; j < 20 - 1; j++) { 
        for (int i = j + 1; i < 20; i++) { 
            if (strcmp(arreglo[j], arreglo[i]) > 0) {
                char temp[20];
                strcpy (temp, arreglo[j]); 
                strcpy (arreglo[j], arreglo[i]); 
                strcpy (arreglo[i], temp); 
            }
        }
    }

    for (int i = 0; i < 20; i++)
        puts (arreglo[i]);
}

(<< [note:您不需要stdlib.h

**示例使用/输出**

$ ./bin/bubblesort_2D_names Ainoa Amparo Ana Azahara Carmelo Concepcio Francesc Igor Jacobo Jairo Jan Jone Jose Josu Luis Miguel Modesta Natalia Ruben Teo

仔细检查,如果您有任何疑问,请告诉我。

0
投票
字符串文字通常存储在只读存储区中,不希望被修改。

在此问题中,无需移动字符串文字。相反,我们可以只修改字符串指针。它更快,更安全。

请检查此代码:

#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { const char *arreglo[20]={"Ruben","Modesta","Jan","Ana","Amparo","Josu","Azahara","Concepcio","Carmelo","Miguel","Francesc","Jairo","Jose","Luis","Teo","Jone","Jacobo","Ainoa","Natalia","Igor"}; int i; int j; const char *sorted[20]; for(i=0;i<20;i++){ sorted[i] = arreglo[i]; } for (j=0; j<20; j++){ for (i=j+1; i<20; i++) { if (strcmp(sorted[j], sorted[i]) > 0) { const char *temp = sorted[j]; sorted[j] = sorted[i]; sorted[i] = temp; } } } for(i=0;i<20;i++){ printf("%d:%s\n",i,sorted[i]); } }

指向字符串文字的指针设置为

“ const char *”

希望这可以帮助您解决问题。
© www.soinside.com 2019 - 2024. All rights reserved.