2014-02-09 2 views
2

Программа, над которой я работаю, использует qsort и мою собственную функцию сравнения, чтобы отсортировать группу слов, считываемых через стандартный ввод. Я помещаю каждый символ в массив указателей на символы, как показано ниже.установка массива указателей на указатели, указание указателя в другом массиве

Массив теперь имеет кучу персонажей, например - "\ 0The \ п \ 0brown \ п \ 0fox \ п \ 0is \ п \ 0lazy \ п"

Я пытаюсь создать еще один массив указатели на указатели, где каждый элемент этого нового массива указывает на первую букву (этот случай - нулевой символ) каждого слова. Итак, элемент 0 указывает на первый \ 0, а элемент 1 указывает на следующий \ 0. Я не уверен, есть ли у меня небольшая синтаксическая ошибка или у меня есть неправильная идея, но что-то продолжает идти не так, потому что выход никогда не в правильном порядке. Код ниже:

int buffersize = 2048; 
int count = 0; 
char* p = (char*) malloc(sizeof(char) * buffersize); 
int c; 
do{ 
    c = getchar(); 
    p[count++] = (char)c; 
    if (count == buffersize) 
    { 
     p = (char*) realloc(p, buffersize * 2); 
     buffersize *= 2; 
    } 
}while (c != EOF); 
p[count-1] = '\n'; 
int i = 0; 
int a = 1; 
char ** pp = (char**) malloc(sizeof(char*) * count); 
pp[0] = &p[0]; 
for (i; i < count; i++) 
{ 
    if (p[i] == '\n') 
    { 
     while (p[i+1] == '\n') 
     {i++;} 
     if (i != (count-1)) 
     { 
      pp[a++] = &p[i+1]; 
     } 
    } 
} 
qsort (pp, (a-1), sizeof(char*), compare); 

Моя функция сравнения

int rot13cmp (const void* c, const void* d) 
{ 
    const char* a = (const char*)c; 
    const char* b = (const char*)d; 
    if (a[0] == '\0' && b[0] == '\t') 
    { 
     return -1; 
    } 
    else if (a[0] == '\t' && b[0] == '\0') 
    { 
     return 1; 
    } 
    int k = 0; 
    for (;;k++) 
    { 
     if (a[k] == '\n' && b[k] != '\n') 
      return -1; 
     if (a[k] != '\n' && b[k] == '\n') 
      return 1; 
     if (a[k] == '\n' && b[k] == '\n') 
      return 0; 
     int one = (int)a[k]; 
     int two = (int)b[k]; 
     int difference = a[k] - b[k]; 
     if (difference != 0) 
      return difference; 
    } 
} 

ответ

1

Ваша функция сравнения неправильно. Если сортируемая последовательность представляет собой последовательность указателей, то адреса, переданные вашему сравнению, - адреса из указатели; не адреса в указатели.

заменить это:

const char* a = (const char*)c; 
const char* b = (const char*)d; 

с этим:

const char * const* lhs = c; 
const char * const* rhs = d; 
const char* a = *lhs; 
const char* b = *rhs; 

или упрощать по желанию. Остальная часть вашей функции должна работать (по крайней мере, так же, как вы ее написали, я никогда не проверял ее на точность, кроме как сказать, что оба one и two не используются и должны быть удалены, а ваша функция должна иметь внешний return 0; избегайте неопределенного результата, если строки идентичны).

+0

спасибо. Это фиксировало большинство моих проблем! Я вернусь, если что-нибудь еще произойдет. –

+0

Np Вы говорите спасибо на этом сайте ответами на голосование или отмечая их как «решение». См. Стрелки и зеленую проверку рядом с ответом выше. – WhozCraig

+0

Ха-ха, у меня нет достаточной репутации для продвижения, однако я сделал зеленый чек! –

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