c语言 - 链表读数不正确和错误消息



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

控制台应用程序 14.exe 中0x5313B5F2 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突写入位置0xCCCCCCCC。

我正在阅读的列表:

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;

}

你的代码中有几个问题。

一个问题是你混合了fgets和fscanf.fgets读取给定的长度,而不管读取什么(假设没有收到EOF)。所以在第一个循环中,当你调用fgets(a.robot, sizeof a.robot, tsin)时,它会读取 15 个字节并将TERMINATOR T-80保存到a.robot中,当你再次调用 fgets 时,它会读取另外 10 个字节并将0 1rnTERMI保存到a.type中。现在下面的fscanf失败了,因为下一个即将到来的字符是N,这不适合%d

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

关闭读取文件描述符后,struct node???以及如何在使用条件p != NULL???循环时打印a.xxx分配temp = temp->next每个循环???

相关内容

  • 没有找到相关文章

最新更新