2

所以我正在开发一个程序,该函数从 stdio 读取,并继续读取n 个字符块中的字符。

到目前为止,我已经将所有内容存储在一个称为缓冲区的字符数组中。对于下一步,我需要对每块 n 个字符进行排序。例如,如果 n =5,字符串cats/ndogs/n 应该拆分为cats/n dogs/n,然后qsort()需要按字母顺序排列。这就是我打电话的方式qsort()

qsort (buffer, (line-2)*n*(sizeof(char)),n,compare);

其中(line-2)*n*sizeof(char)给出数组缓冲区中的项目总数;在这种情况下为 10。

这是我的比较功能:

int compare (const void * a, const void * b)
{
   return (strcmp(*(char **)a, *(char **)b));
}

但是,当我运行它时,我总是在strcmp(). 任何想法为什么?


这是加载代码:

while (!feof(stdin))
{
    for (i = 0; i < n; i++)
    {
        char l = getchar();
        if (l != EOF)
        {
            if ((i == 0) && (line != 1))
            {
                success = (int *)realloc(buffer, line*n*(sizeof(char)));
            }
            buffer[(n*(line-1))+i] = l;
        }
     }
     line = line + 1;
}
4

2 回答 2

1

愚蠢的问题,但是您的字符串是否以空值终止?您似乎最后只有一个换行符。

此外,您可能只需要“strcmp((char *)a, (char *)b)”,因为额外的 *s 看起来对我来说是多余的。

于 2012-02-11T07:52:36.490 回答
0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char buffer[] ="333000222555111777888666999444";

int mycmp(void *l, void*r);
int main(void)
{
/* note: sizeof buffer is 31,
** but the integer division will round down
** , ignoring the extra nul-byte */
qsort(buffer, (sizeof buffer/3), 3, mycmp);
printf ("[%s]\n", buffer);

return 0;
}

int mycmp(void *l, void *r)
{
return memcmp(l,r,3);
}
于 2012-02-11T15:15:50.820 回答