我将数据从文本文件导入到链接列表,但fscanf
给出了奇怪的数字。
我的结构:
struct arac
{
struct arac *next;
char marka[15];
char model[15];
char paket[15];
char renk[10];
int yil;
char motor[8];
char sanz[3];
int km;
int kayitno;
};
这也是我的添加功能:
struct arac *aktar(struct arac *go)
{
FILE *imptr = fopen("Yenikayit.txt","r");
if(imptr==NULL)
{
printf("\nDosya bulunamadi.");
return NULL;
}
else
{
while(feof(imptr)!=0)
{
go=(arac*)malloc(sizeof(arac));
fscanf(imptr,"\n%d %d %s %s %s %s %d %s %s",go->kayitno, go->km, go->marka, go->model, go->paket, go->renk, go->yil, go->motor, go->sanz);
printf("\n%d %d %s %s %s %s %d %s %s", go->kayitno, go->km, go->marka, go->model, go->paket, go->renk, go->yil, go->motor, go->sanz);
go->next=NULL;
go=go->next;
}
}
}
嵌入printf
进行调试,以便提供此输出,程序崩溃:
947398688 1929405816 S>,│Aæz rs\Berk Ízel\Desktop\otm-final\otm-final.exe sktop\otm-final\otm-final.exe 1818324585 \otm-final.exe al.exe
1207974467 1027954249 \Berk Ízel\Desktop\otm-final\otm-final.exe top\otm-final\otm-final.exe tm-final.exe (x88,│Gùz 1446944
答案 0 :(得分:1)
您将结构成员的值赋予了
fscanf(imptr,"\n%d %d %s %s %s %s %d %s %s",go->kayitno, go->km, go->marka, go->model, go->paket, go->renk, go->yil, go->motor, go->sanz);
你应该指出其中的一些(除了那些无论如何都会衰变成指针的那些):
fscanf(imptr,"\n%d %d %s %s %s %s %d %s %s", &(go->kayitno), &(go->km), go->marka, go->model, go->paket, go->renk, &(go->yil), go->motor, go->sanz);
您还应该将return语句添加到if
内aktar()
的else分支。
要验证scanf()操作是否成功,请将返回值添加到调试输出中。阅读关于返回值含义的规范,它会告诉你扫描的成功程度。
然后你会发现在一行中扫描几个字符串很棘手
更改为不同的阅读功能以解决该问题
使用fgets()
获取整行,然后使用例如解析行strtok()
应该是一个有效的概念。
当您成功地分别扫描字符串时,您会注意到扫描例如“Ízel\ Desktop \ otm-final \ otm-final.exe”成为一个15个成员的char数组注定会导致写入超出目标变量,从而导致未定义的行为。如果可以定义最大长度,请相应地增加数组大小。如果您无法定义最大长度,则会出现一个全新的问题,即读取未知长度的文本。请参阅其他问题。
然后在不同的抽象层面上存在问题,pgngp在评论中已经提到过。引用(如果有价值的评论丢失了......):
看起来链接列表无法正确创建,因为go的上一个节点未指向go。
解决方法可能涉及使用指向指针。
所有这些只是让你可以看到你的代码中有几个隐藏不同的陷阱。我列举了一些,表明你的根本原因有多复杂。我建议退一步。
这个有趣的文字你可能会发现问题的实际答案:
https://ericlippert.com/2014/03/21/find-a-simpler-problem/
请理解,这并不意味着“放弃”或任何其他不礼貌。这是一种在有效和可测试的东西的基础上返回代码的方法。然后你可以再次开始向你的目标递增。
答案 1 :(得分:0)
好的,我更改了函数元素嵌入main,
FILE *fptr = fopen("Yenikayit.txt","r");
struct arac *go = root;
//yazdirall(root);
while(!feof(fptr))
{
go=(arac*)malloc(sizeof(arac));
go->next=NULL;
fscanf(fptr,"\n%d %d %s %s %s %s %d %s %s", &(go->kayitno), &(go->km), go->marka, go->model, go->paket, go->renk, &(go->yil), go->motor, go->sanz);
printf("%d %d %s %s %s %s %d %s\n",go->kayitno, go->km, go->marka, go->model, go->paket, go->renk, go->yil, go->motor, go->sanz);
go=go->next;
}
在while循环中使用printf进行调试时,没关系。打印正确的值以从文本输出。
但是当从root尝试时,我会得到奇怪的输出;
printf("%d %d %s %s %s %s %d %s\n",root->kayitno, root->km, root->marka, root->model, root->paket, root->renk, root->yil, root->motor, root->sanz);