Вы хотите отсортировать 50 пар строк и цифр в соответствии с номером. Для этого вы определили массив из 100 строк. Я предлагаю вам представить данные как два массива из 50 целых чисел и 50 строк. (Это только первая идея, см. Ниже для лучшей рекомендации.)
Строки в C - это действительно массивы символов, которые имеют нулевой байт в конце. Вы не можете назначать массивы друг другу, но вы можете скопировать их содержимое. Если вы хотите поменять строки, вам нужно скопировать фактические символы. Функция strcpy
от <string.h>
умирает это для вас.
Когда вы сортируете массивы, вы выполняете сравнение только на одном массиве, но обмениваете оба массива одновременно. Подкачка чисел является прямой, строковый обмен требует глубоких копий с strcpy
.
Вот первый проект:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define N 50
#define MAXLEN 40
int main(void)
{
char str[N][MAXLEN];
int num[N];
int i, j;
for (i = 0; i < N; i++) {
if (scanf("%s%d", str[i], &num[i]) != 2) {
fprintf(stderr, "Wrong input format!");
exit(1);
}
for (j = 0; str[i][j] != '\0'; j++) {
str[i][j] = tolower(str[i][j]);
}
}
for (i = 0; i < N; i++) {
printf("%s %d\n", str[i], num[i]);
}
for (i = 0; i < N; i++) {
for (j = i + 1; j < N; j++) {
if (num[i] > num[j]) {
int tnum;
char tstr[MAXLEN];
tnum = num[i];
num[i] = num[j];
num[j] = tnum;
strcpy(tstr, str[i]);
strcpy(str[i], str[j]);
strcpy(str[j], tstr);
}
}
}
puts("--");
for (i = 0; i < N; i++) {
printf("%s %d\n", str[i], num[i]);
}
return 0;
}
Обычный подход, когда вы должны держать вещи вместе, чтобы упаковать их в структуры. Затем вы можете перемещать целые структуры, не беспокоясь о том, что строка и число не синхронизируются.
Структуры могут быть назначены друг другу; их содержимое затем копируется. Это упрощает обмен. Другим преимуществом является то, что структуры могут сортироваться со стандартной процедурой сортировки qsort
от <stdlib.h>
.
Так давайте сделаем это:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define N 50
#define MAXLEN 40
struct pair_t {
char str[MAXLEN];
int num;
};
int main(void)
{
struct pair_t pair[N];
int i, j;
for (i = 0; i < N; i++) {
if (scanf("%s%d", pair[i].str, &pair[i].num) != 2) {
fprintf(stderr, "Wrong input format!");
exit(1);
}
for (j = 0; pair[i].str[j] != '\0'; j++) {
pair[i].str[j] = tolower(pair[i].str[j]);
}
}
for (i = 0; i < N; i++) {
printf("%s %d\n", pair[i].str, pair[i].num);
}
for (i = 0; i < N; i++) {
for (j = i + 1; j < N; j++) {
if (pair[i].num > pair[j].num) {
struct pair_t tmp;
tmp = pair[i];
pair[i] = pair[j];
pair[j] = tmp;
}
}
}
puts("--");
for (i = 0; i < N; i++) {
printf("%s %d\n", pair[i].str, pair[i].num);
}
return 0;
}
Наконец – но это более сложная тема – если ваши длинные структуры являются, вы в конечном итоге замены много байт, который не является очень эффективным. Вы можете создать массив указателей для вашей пары и просто отсортировать указатели и оставить исходный массив на месте.
temp = * a [i]; действительно ли это? – venki
Извините. Я случайно отправил старый код. Это должно быть * temp = * a [i] –
Пожалуйста, отсканируйте свой код правильно, если вы ожидаете, что кто-нибудь его прочитает. – Lundin