gpt4 book ai didi

C结构字符串错误

转载 作者:太空宇宙 更新时间:2023-11-04 04:44:31 25 4
gpt4 key购买 nike

这是我的一些代码块,可以让您了解我的问题

    typedef struct {
int count;
char *item;
int price;
char *buyer;
date *date;
}transaction;

transaction *open(FILE *src, char* path) {
char buffer[100], *token;
int count = 0;
transaction *tlist = (transaction*)malloc(sizeof(transaction));
tlist = alloc(tlist, count);
src = fopen(path, "r");
if (src != NULL) {
printf("\nSoubor nacten.\n");
}
else {
printf("\nChyba cteni souboru.\n");
return NULL;
}
while (fgets(buffer, sizeof(buffer), src)) {
tlist = alloc(tlist, count+1);
token = strtok(buffer, "\t"); //zahodit jméno obchodníka
tlist[count].count = strtok(NULL, "x");
tlist[count].item = strtok(NULL, "\t");
tlist[count].item++;
tlist[count].item[strlen(tlist[count].item)] = '\0';
tlist[count].price = atoi(strtok(NULL, "\t "));
token = strtok(NULL, "\t"); //zahodit md
tlist[count].buyer = strtok(NULL, "\t");
tlist[count].date = date_autopsy(strtok(NULL, "\t"));
count++;
}
fclose(src);
return tlist;
}

transaction *alloc(transaction *tlist, int count) {
if (count == 0) {
tlist[0].item = (char*)malloc(20 * sizeof(char));
tlist[0].buyer = (char*)malloc(20 * sizeof(char));
}
else {
tlist = (transaction*)realloc(tlist, count * sizeof(transaction));
tlist[count - 1].item = (char*)malloc(20 * sizeof(char));
tlist[count - 1].buyer = (char*)malloc(20 * sizeof(char));
}
return tlist;
}

首先在 main() 中,我创建了列表

transaction *list = (transaction*)malloc(sizeof(transaction));

然后使用正确的命令,我调用我的打开函数来加载一个文件,然后它将该文件中的一行标记为片段,然后将其放入结构中。一切正常。当我想在打开函数中打印(用于测试)tlist[count].item 时,它会打印正确的内容。但是当我在外面(在 main() 中)尝试它时,它会打印垃圾。它以某种方式适用于结构的日期和价格部分。我假设“买家”字符串也会被破坏。提前致谢

最佳答案

  1. 由于您正在用 item 的本地缓冲区覆盖分配的内存,bueyr 字段因此它不会反射(reflect)在调用函数中。修改代码如下

    tlist[count].count = strtok(NULL, "x") -> strcpy(tlist[count].count, strtok(NULL, "x"))

    tlist[count].buyer = strtok(NULL, "\t") -> strcpy(tlist[count].buyer, strtok(NULL, "\t"))

    同时检查 tlist[count].date ,你应该为日期分配内存并使用 memcpy 复制内容。

  2. 既然 strtok 返回以 NULL 结尾的字符串,那么下面几行有什么用?

    tlist[计数].item++;

    tlist[count].item[strlen(tlist[count].item)] = '\0';

关于C结构字符串错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22555862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com