【问题标题】:Linked list incorrect reading & error message链表读取错误和错误消息
【发布时间】:2017-06-27 20:09:49
【问题描述】:

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

在 ConsoleApplication14.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;

}

【问题讨论】:

  • 不要将fgetsfscanf 混用。将复杂的while 分解成更小的部分。从每个输入行的单个 fgets 开始并进一步检查它 - 您不能明智地将两个 fgets 调用应用于同一输入行。您正在尝试限制读取的输入长度,但第二个字段的长度不同。

标签: c linked-list


【解决方案1】:

你的代码有几个问题。

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

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

而在关闭读取文件描述符后,struct node是什么???在循环条件为p != NULL 时如何打印a.xxx?分配 temp = temp-&gt;next 每个循环???

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    相关资源
    最近更新 更多