Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 链表错误阅读&;错误消息_C_Linked List - Fatal编程技术网

C 链表错误阅读&;错误消息

C 链表错误阅读&;错误消息,c,linked-list,C,Linked List,我想读取一个文本文件,将该文本文件中的信息放入链接列表,关闭该文件,然后使用链接列表将所有内容打印到我的程序中。 出于某种原因,我在剩余列表的第一行之后得到“-858993460”,直到我到达我的15行,然后我得到一个错误: 在ConsoleApplication14.exe中的0x5313B5F2(ucrtbased.dll)处引发异常:0xC0000005:访问冲突写入位置0xCCCC 我阅读的清单如下: TERMINATOR T-800 1 TERMINATOR T-1000 2 TE

我想读取一个文本文件,将该文本文件中的信息放入链接列表,关闭该文件,然后使用链接列表将所有内容打印到我的程序中。 出于某种原因,我在剩余列表的第一行之后得到“-858993460”,直到我到达我的15行,然后我得到一个错误:

在ConsoleApplication14.exe中的0x5313B5F2(ucrtbased.dll)处引发异常:0xC0000005:访问冲突写入位置0xCCCC

我阅读的清单如下:

TERMINATOR T-800 1

TERMINATOR T-1000 2

TERMINATOR T-800 3

TERMINATOR T-800 4

TERMINATOR T-1000 5

TERMINATOR T-800 6

TERMINATOR T-800 7

TERMINATOR T-800 8

TERMINATOR T-1000 9

TERMINATOR T-800 10

TORMONUTTUR T-800 101

TERMINATOR T-800 11

FEL FEL FEL

TERMINATOR T-1000 12

TERMINATOR T-800 13

TERMINATOR T-800 14

TERMINATOR           T-800         15

       TERMINATOR T-1000 16

TERMINATOR T-800 17                       

TERMINATOR T-800 18

TERMINATOR T-1000 19

TERMINATOR T-800 20
有人能解释一下吗

#include <stdio.h>
#include <stdlib.h>
struct Link {
char robot[15];
char terminatortyp[10];
int idnr;
struct Link *next;
};
struct Link *first = NULL;

int main(void) {
int antal = 0;
struct Link a;
FILE *tsin = fopen("textfil1R.txt", "r");
if (tsin == NULL) {
    printf("Kunde inte läsa filen 'textfil.txt'.\n");
    exit(EXIT_FAILURE);
}

struct Link *temp;
while (fgets(a.robot, sizeof a.robot, tsin) != NULL && fgets(a.terminatortyp, sizeof a.terminatortyp, tsin) != NULL && fscanf(tsin, "%d", &a.idnr) != EOF)
{
    temp = malloc(sizeof(struct Link));
    *temp->robot = a.robot;
    *temp->terminatortyp = a.terminatortyp;
    temp->idnr = a.idnr;
    temp->next = first;
    first = temp;

    ++antal;
}
fclose(tsin);

struct node *p; 
p = first; 
while (p != NULL)
{
    printf("%s", a.robot);
    printf("%s", a.terminatortyp);
    printf("%d", a.idnr);
    temp = temp->next;
}

printf("%d", antal);
getch();
return 0;
#包括
#包括
结构链接{
字符机器人[15];
字符终止符typ[10];
int idnr;
结构链接*下一步;
};
结构链接*first=NULL;
内部主(空){
int antal=0;
结构链接a;
文件*tsin=fopen(“textfil1R.txt”、“r”);
if(tsin==NULL){
printf(“Kunde inte läsa filen'textfil.txt.\n”);
退出(退出失败);
}
结构链接*temp;
while(fgets(a.robot,sizeof a.robot,tIn)!=NULL和&fgets(a.terminatortyp,sizeof a.terminatortyp,tIn)!=NULL和&fscanf(tIn,%d,&a.idnr)!=EOF)
{
temp=malloc(sizeof(struct-Link));
*温度->机器人=机器人;
*temp->terminatortyp=a.terminatortyp;
温度->idnr=a.idnr;
临时->下一步=第一步;
第一个=温度;
++安塔尔;
}
fclose(青岛);
结构节点*p;
p=第一;
while(p!=NULL)
{
printf(“%s”,a.robot);
printf(“%s”,a.terminatortyp);
printf(“%d”,a.idnr);
温度=温度->下一步;
}
printf(“%d”,antal);
getch();
返回0;

}您的代码中有几个问题

一个问题是您混合了FGET和fscanf。fgets读取给定长度的,而不管读取的是什么(假设没有接收到EOF)。因此在第一个循环中,当您调用
fgets(a.robot,sizeof a.robot,tsin)
,它读取15个字节并将
终止符T-80
保存到
a.robot
,当您再次调用fgets时,它再读取10个字节,并将
0 1\r\nTERMI
保存到
a.type
中。现在,以下
fscanf
失败,因为下一个字符是
N
,它不适合
%d

另一个问题是您正在指定类似指针的数组,这就是产生错误的原因。(由于没有为您找到此问题,编译器很糟糕)
a.robot
属于
char[15]
类型,当您分配
*temp->robot=a.robot
时,您试图将
char[15]
分配给
char
*temp robot
基本上与
temp->robot[0]
相同)。这同样适用于下一行。您应该改用strcpy(或更安全的strncpy)


关闭读取文件描述符后,什么是结构节点???在循环使用条件
p!=空值
???分配
temp=temp->next
每个循环时?

不要将
fgets
fscanf
混合。将复杂的
分解成更小的部分。从每个输入行的一个
fgets
开始,并进一步检查它-您不能明智地对同一输入行应用两个
fgets
调用。您正试图限制读取的输入长度,但第二个字段的长度并不完全相同。