微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从带有 strtok + qsort 问题的行读取

如何解决从带有 strtok + qsort 问题的行读取

我想创建一个程序,它从 {key: value} 形式的外部文件获取行。例如,我们有文件 t.dat:

{myName: Mario}
{name2: Asdadas}
{someOtherData: _D123}

我的程序应该根据 key 的长度(在我们的例子中为 myNamename2someOtherData)以递减的方式对这些数据进行排序,并且如果找到两个长度相同的键,则应根据 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 variablerealloc

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 举报,一经查实,本站将立刻删除。