如何解决从带有 strtok + qsort 问题的行读取
我想创建一个程序,它从 {key: value}
形式的外部文件中获取行。例如,我们有文件 t.dat
:
{myName: Mario}
{name2: Asdadas}
{someOtherData: _D123}
我的程序应该根据 key
的长度(在我们的例子中为 myName
、name2
或 someOtherData
)以递减的方式对这些数据进行排序,并且如果找到两个长度相同的键,则应根据 value
按字典顺序对它们进行排序。
我通过使用 struct array
来完成此操作,该 typedef struct Line{
char key[50];
char value[50];
}Line;
将保留文档中每一行的数据:
fgets
并尝试使用 strtok
(提取每一行)和 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 512
typedef struct Line{
char key[50];
char value[50];
}Line;
int comp(const void* a,const void* b)
{
const Line *aa = a;
const Line *bb = b;
puts(bb->key);
if (strlen(aa->key) == strlen(bb->key)) {
return strcmp(aa->key,bb->key);
}
return strlen(bb->value)-strlen(aa->value);
}
int main(int argc,char** argv)
{
if (argc != 2)
{
printf("Invalid number of args.\n");
return -1;
}
FILE *f = fopen(argv[1],"rb");
if (!f)
{
printf("Unable to open the specified file.\n");
return -2;
}
Line* ln;
char buff[MAX];
int lineNumber = 0;
int isSet = 0;
int i = 0;
while (fgets(buff,MAX,f))
{
char *p = strtok(buff," {}:\n\r\t");
while (p)
{
char word[MAX] = "";
if (isSet == 0)
{
ln = malloc(1*sizeof(ln));
isSet = 1;
}
else if (i == 0) ln = (Line*)realloc(ln,(lineNumber+1)*sizeof(ln));
word[0] = '\0';
if (i == 0) {
strcpy(word,p);
strcpy(ln[lineNumber].key,word);
i = 1;
}
else if (i == 1) {
strcpy(word,p);
strcpy(ln[lineNumber].value,word);
lineNumber++;
i = 0;
}
p = strtok(NULL," {}:\n\r\t");
}
}
qsort(ln,lineNumber,sizeof(ln),comp);
puts("\n");
for (int i = 0; i<lineNumber; i++)
{
printf("%s\n",ln[i].key);
}
return 0;
}
从文件中取出该数据。
这是我的全部代码:
value
问题是,第一行的数据没有被正确读取(我指的是 "Mario"
- key
。它包含来自 Mario
的元素,但肯定不是词strtok
)。认为这可能来自 comp
,但没有找到解决方案。
此外,使用提供的 {{1}} 函数未正确排序数据。它根本没有订购。输出与下单前一样。
我能做什么?谢谢你。如果需要更多详细信息,请告诉我,我会确保将其发布。
解决方法
问题是
ln = (Line*)realloc(ln,(lineNumber+1)*sizeof(ln));
你想为n个元素保留空间,而不是n个元素指针,切换到
ln = realloc(ln,(lineNumber+1)*sizeof(*ln)); // Don't cast
还有,always use a temporary variable 和 realloc
:
Line *temp = realloc(ln,(lineNumber+1)*sizeof(*ln));
if (temp == NULL)
{
// raise error
}
ln = temp;
这里也一样
qsort(ln,lineNumber,sizeof(ln),comp);
每个元素都占用sizeof(*ln)
,而不是sizeof(ln)
,切换到
qsort(ln,sizeof(*ln),comp);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。