我想读取一个文件,然后在一个按字母顺序排序的数组中写入文件。但是,我在使用 gdb 时不断遇到分段错误,这表明我的显示和排序功能出现分段错误。
编辑:我通过使用宏分配内存来修复它。由于这是一项任务,我不想透露它以防万一。我非常感谢大家对我的代码的帮助。
我想读取一个文件,然后在一个按字母顺序排序的数组中写入文件。但是,我在使用 gdb 时不断遇到分段错误,这表明我的显示和排序功能出现分段错误。
编辑:我通过使用宏分配内存来修复它。由于这是一项任务,我不想透露它以防万一。我非常感谢大家对我的代码的帮助。
你应该这样做吗?哎哟。
我也遇到了段错误,但是在 read_names() 中。我可以通过用一个简单的 scanf() 替换所有 strtok() 东西来修复它:
void read_names (FILE *fp, char **f, char **l, char *m, int num)//read it
{
int i=0;
char temp[80];
for (i=0; i<num; i++)
{
fscanf( fp, "%s %s %s", f[i], l[i], m);
}
}
之后,我能够进行排序和打印,尽管它最后试图错误地释放()某些东西。
我一般 strtok() 是不安全的,只是一种痛苦 - 它会破坏你的字符串。
此外,更有意义的名称使其更易于使用。我最终发现“l[]”是一个包含姓氏的字符串数组,但是类似于“sLastName[]”的东西会大大加快速度。
编辑:
我收集了您的输入文本文件,如下所示:
2 bill smith a doug adams r
编辑2:
好的,发现另一个段错误。什么是“数”?它似乎被解释为文件中名称的数量和每个名称的大小?
// allocate "num" first name elements -> implied "num" is # of names
f=(char**)malloc (num*sizeof(char*));
// allocate space for each name... but uses the value of "num" for each name
for (i=0; i<num;i++)
f[i]=(char*)malloc (num*sizeof(char)); // "num" bytes per name?
当我开始为每个名称分配 100 个字节而不是“num”的值时,第二个 - 对我来说也是最后一个 - 段错误消失了。
有没有进入整个程序然后开始测试?让它以小步骤工作然后逐步添加功能会容易得多 - 使用调试器和/或 printf() 验证它在每一步都在做你想做的事情。