Программа, над которой я работаю, использует 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;
}
}
спасибо. Это фиксировало большинство моих проблем! Я вернусь, если что-нибудь еще произойдет. –
Np Вы говорите спасибо на этом сайте ответами на голосование или отмечая их как «решение». См. Стрелки и зеленую проверку рядом с ответом выше. – WhozCraig
Ха-ха, у меня нет достаточной репутации для продвижения, однако я сделал зеленый чек! –