我正在使用的程序使用qsort和我自己的比较函数来对通过标准输入读取的一组单词进行排序。我将每个字符放入指向字符的指针数组,如下所示。
数组现在具有一堆字符,例如-“ \ 0The \ n \ 0brown \ n \ 0fox \ n \ 0is \ n \ 0lazy \ n”
我正在尝试创建另一个指针数组,其中这个新数组的每个元素都指向每个单词的第一个字母(在这种情况下为空字符)。因此,元素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;
}
}
您的比较功能不正确。如果要排序的序列是指针的序列,那么地址传递给你比较有地址的指针; 未解决的指针。
替换为:
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;
以避免未定义)如果字符串相同,则返回结果)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句