【发布时间】:2012-02-11 07:35:30
【问题描述】:
所以我正在开发一个程序,该函数从 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;
}
【问题讨论】:
-
加载代码(应该真的在问题中)看起来很糟糕;你需要使用
realloc()的返回值:这是你的新buffer! -
您的
char l = getchar();是一场小灾难;getchar()返回int,而不是char。如果字符是无符号的,EOF 测试将永远不会为真。如果字符已签名,您将在读取字符代码 0xFF(通常为 U+00FF、ÿ、带分音符号的拉丁小写字母 Y 或 y-umlaut,特别是在土耳其语中使用)时得到一个虚假的 EOF。将realloc()的返回值保存在一个新变量中是好。不检查内存分配失败是坏,然后不使用新值代替旧值是坏。使用realloc()可以移动你的记忆。 -
1) 什么是第 2 行)你的 feof() 用法是不切实际的 3) 强制转换 malloc() et.al 是不需要的 4) realloc() 一个指向 int 指针的 char 指针很神奇! 5)什么是成功? 6) sizeof(char) 根据定义为 1。 7) 什么是缓冲区? 8) Jonathan 对 char 和 EOF 的看法。
-
您的比较函数对于通过比较指针指向的字符串对字符指针数组进行排序是正确的。您在阅读代码中创建的数据结构不是字符指针数组——不管它是什么。重新设计您的阅读代码并验证您可以安全地回显您阅读的内容。如果您有
valgrind,请使用它。然后考虑整理一下。 (提示:分配一个字符指针数组;然后为每一行分配一个新字符串。) -
我的贡献解决了他的 original 问题,即所有固定大小的元素并排存在于缓冲区中。