2015-08-27 1 views
-3

Если моя Экс строка IS-«Friend 32 Hello 12» Мой вывод должен быть- «привет 12 друг 32»Сортировка строку со словами и цифрами в альтернативном положении в C

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

int main(void) { 
    char a[100][100],temp[100]; 
    int i,j,c; 
    for(i=0;i<100;i++) 
    { 
    scanf("%s",a[i]); 
    if(i%2==0) 
    { 
     for(j=0;j<100;j++) 
     { 
      if(isupper(a[i][j])) 
      a[i][j]=a[i][j]+32; 
     } 
    } 
    } 
    for(i=0;i<100;i++) 
    { 
     printf("%s",a[i]); 
     printf("\n"); 
    } 
    for(i=0;i<99;i=i+2) 
    { 
     for(j=i+2;j<100;j=j+2) 
     { 
      c=strcmp(a[i],a[j]); 
      if(c>0) 
      { 
      *temp=*a[i]; 
      *a[i]=*a[j]; 
      *a[j]=*temp; 

     } 
     } 

    } 
    for(i=0;i<100;i=i+2) 
    { 
     printf("%s",a[i]); 
    } 

    return 0; 
} 

Я не» t понять, где мой код неправильный. Он печатает некоторые значения мусора. Я использую алгоритм выбора выбора.

+0

temp = * a [i]; действительно ли это? – venki

+0

Извините. Я случайно отправил старый код. Это должно быть * temp = * a [i] –

+0

Пожалуйста, отсканируйте свой код правильно, если вы ожидаете, что кто-нибудь его прочитает. – Lundin

ответ

0

Вы хотите отсортировать 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; 
} 

Наконец – но это более сложная тема – если ваши длинные структуры являются, вы в конечном итоге замены много байт, который не является очень эффективным. Вы можете создать массив указателей для вашей пары и просто отсортировать указатели и оставить исходный массив на месте.