2014-01-06 4 views
0

Предполагается, что программа должна сравнивать строки и размещать их в алфавитном порядке, но окончательный printf-оператор печатает мусор ... где я здесь не так?
я использовал массив указателей на строки и объявил их в начале, я даже пытался использовать температуру как массив, а не указатель стили оленью кожу достаточно работатьЧто происходит с моей программой?

#include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    int main() 
    { 
    int j; 
    int i; 
     char *temp; 
     char *string[5] = {"ibrahim","laura","peter","degea"}; 
     for (i = 0; i< 4;i++) 
     printf("%s\n", string[i]); //allocating memory 
     for(i = 0; i< 10 ;i++) 
     string[i] = (char*)malloc (30 * sizeof(char));    
     temp = (char*)malloc(30*sizeof(char));    
     for (i=0; i< 3; i++) 
     for(j =i+1; j<4; j++) 
     { 
      if(strcmp(string[i], string[j]) > 0) 
      { 
      strcpy(temp, string[i]); 
      strcpy(string[i], string[j]); 
      strcpy(string[j], temp); 

      } 
     } 
     for (i = 0; i< 4; i++) 
     { 
      printf("%s\n",string[i]); 
      puts("\n"); 
     } 
     free(string); 
     free(temp); 
     return 0; 
    } 
+0

'string [i] = (char *) malloc (30 * sizeof (char));' что? – moeCake

+0

Извините, откажись от моего ответа, я удалил .. –

+4

@OP, пожалуйста __DO NOT__ отредактируйте свое оригинальное сообщение на основе предоставленных ответов. Это заставляет всех людей, которые потрудились ответить, выглядят неправильно и глупо. –

ответ

1

string[i] = (char*)malloc (30 * sizeof(char));

Это перезаписывания существующие инициализированные значения.

EDIT

for(i = 0; i< 10 ;i++) 

temp = (char*)malloc(30*sizeof(char)); 

ЧТО? вы выделяете память более 10 раз на один указатель?

EDIT 2:

Исходное сообщение теряется (читай отредактирован). К тому моменту, когда вы читаете этот ответ, и г-н Джонатан Леффлер, и этот плакат-миг выглядят абсолютными дураками в этом мире.

+0

Код - это беспорядок, потому что два человека его редактировали ... это безумие! –

+0

@JonathanLeffler Право. Почему люди редактируют других __code__? –

+0

Это была попытка улучшить макет; к сожалению, он переписал изменения OP. Это усложняет жизнь для всех. –

1

Код первоначально уничтожил свой массив данных (путем выделения новых указателей). Теперь кажется, что он отбрасывает память, выделяя temp четыре раза (но редактирование Jeevan восстанавливает старый код в отступом). Старый код выделял пространство для строк, но не инициализировал их (предварительно отбросив значение, которое было в массиве).

NB: Любой комментарий к коду может быть легко недействительным к моменту чтения комментария - код в вопросе мог быть изменен.


for (i = 0; i < 10; i++) 
    string[i] = malloc(30); 

Этот код топчет из пределы string массива (размер 5). Он также теряет данные изначально в массиве.


Вы должны использовать strcmp() для сравнения строк, но вам просто нужно поменять местами указатели, а не использовать strcpy() вообще.

Замечание // allocating memory рядом с заявлением printf() также вводит в заблуждение.


Это шанс работать. Обратите внимание, что не существует никакого распределения памяти:

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

int main(void) 
{ 
    int j; 
    int i; 
    char *string[] = { "ibrahim", "laura", "peter", "degea" }; 

    for (i = 0; i < 4; i++) 
     printf("%s\n", string[i]); 

    for (i = 0; i < 3; i++) 
    { 
     for (j = i+1; j < 4; j++) 
     { 
      if (strcmp(string[i], string[j]) > 0) 
      { 
       char *temp = string[i]; 
       string[i] = string[j]; 
       string[j] = temp; 
      } 
     } 
    } 

    for (i = 0; i < 4; i++) 
     printf("%s\n",string[i]); 

    return 0; 
} 

Выход:

ibrahim 
laura 
peter 
degea 
degea 
ibrahim 
laura 
peter 

Комментарий: не пытайтесь сортировать тысячи строк с помощью этого алгоритма сортировки.

+0

Я думаю, что лучше сначала закончить редактирование. Тогда мы могли бы подумать над этим. –

0

Вы переписываете существующее содержимое массива строк с помощью malloc, что тоже 10 раз. Пожалуйста, используйте фигурные скобки в вашем коде для лучшего понимания

for(i = 0; i< 10 ;i++) 
    string[i] = (char*)malloc (30 * sizeof(char));    
    temp = (char*)malloc(30*sizeof(char));  

можно записать в виде

for(i = 0; i< 10 ;i++) // why to allocate memory ten times, that too overwriting 
    { 
    string[i] = (char*)malloc (30 * sizeof(char));    
    } 

    temp = (char*)malloc(30*sizeof(char));  
0

при объявлении: символ * строка [5] = { "Ибрахим", "Лауры" , "peter", "degea"};

указатель * строка [0] до * строка [3], выделенная на адрес в памяти, где будет хранилось значение инициализации «Ибрахим», «Лауру» ...

при использовании функции таНоса для строки указателя [i] = (char *) malloc (30 * sizeof (char)); указатель * string [0] to * string [4] будет присвоен другой адрес в памяти. поэтому значение по указанному адресу отличается от значения, которое вы инициализировали (ibrahim, laura).

вы должны использовать статический массив вместо динамического, как показано ниже

полукокса темп;

символ строки [5] = { "Ibrahim", "Лауры", "Питер", "degea"};

удалить все функции malloc, бесплатно.

Смежные вопросы