Когда вы объявляете array-of-pointers-to char
и инициализируете каждый указатель на строку, каждая из этих строк является String Literal и не может быть изменена ( Есть очень мало исключений). Чтобы поменять местами строки, каждая из строк должна находиться в памяти, которую можно изменить, например, в массиве или в выделенном блоке памяти.
Простое решение в вашем случае - сделать arreglo
a 2D массив вместо массива указателей , например char arreglo[20][20]
. Другой вариант - оставить arreglo
в качестве массива указателей , но затем выделить хранилище для каждого указателя, а затем скопировать имя в каждый из выделенных блоков перед сортировкой (немного сложнее).
У вас та же проблема с 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]);
}
( примечание: вам не нужно 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
Просмотрите все и дайте Я знаю, если у вас есть вопросы.