我一直在尝试对字符串数组进行冒泡排序,但始终会收到“细分错误”错误。任何帮助表示赞赏。
#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);
}
}
}
}
当声明指向数组的指针 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
仔细检查,如果您有任何疑问,请告诉我。
在此问题中,无需移动字符串文字。相反,我们可以只修改字符串指针。它更快,更安全。
请检查此代码:
#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 *”
希望这可以帮助您解决问题。