Как исправить сообщение «Нарушение прав доступа 0xFFFFFFCD.»? - PullRequest
0 голосов
/ 17 июня 2019

Я хочу прочитать данные из ФАЙЛА и сохранить их в связанном списке, и моя проблема, очевидно, связана с командой чтения "fscanf".

Я пытаюсь создать функцию, которая получает заголовок связанного списка и указатель на файл. Функция считывает данные из файла и сохраняет их в узле, а затем соединяет узел с началом связанного списка, то есть с заголовком, а не с концом.

#include <stdio.h>
#include <stdlib.h>

#define NameLength 15

typedef struct Product {
    char ProductName[NameLength];
    int Quantity;
    int Price;
    char Premium;
}Product;

typedef struct ProductList {
    Product P;
    struct ProductList* next;
}ProductList;

void DeleteList(ProductList*);
void ErrorMsg(const char*);
int CheckInList(ProductList*, const char*);

void CreateProducts(ProductList *head, FILE *fp) {
    ProductList *temp = (ProductList*)malloc(sizeof(ProductList));
    //If the dynamic memory allocation for temp has failed, print a 
message and exit the program.
    if (!temp) {
        DeleteList(head);
        ErrorMsg("Error: Memory allocation of temp in CreateProducts has 
failed.");
     }

    temp->next = NULL;
    while (!feof(fp)) {
        fscanf(fp, "%s%d%d%c", temp->P.ProductName, &temp->P.Quantity, 
&temp->P.Price, temp->P.Premium);
        if (CheckInList(head, temp->P.ProductName))
            printf("Error: Product is already found in the list.\n");
        else {
            if (temp->P.Quantity < 0)
            printf("Error: Quantity of the product cannot be 
negative.\n");
            else {
                if (temp->P.Price < 0)
                    printf("Error: Price of the product cannot be 
negative.\n");
                else
                {
                    //Adding the product to the beginning of the list 
every time.
                    if (head == NULL)
                        head = temp;
                    else
                    {
                        temp->next = head->next;
                        head->next = temp;
                    }
                }
            }
        }
    }
    if (head != NULL)
        printf("Products' information have been received.\n");
    else
        ErrorMsg("Products' information have NOT been received.");
}

1 Ответ

5 голосов
/ 17 июня 2019

Включите предупреждения вашего компилятора! Он буквально даст вам ответ.

main.cpp: In function 'void CreateProducts(ProductList*, FILE*)':
main.cpp:33:20: warning: format '%c' expects argument of type 'char*', but argument 6 has type 'int' [-Wformat=]
         fscanf(fp, "%s%d%d%c", temp->P.ProductName, &temp->P.Quantity,
                    ^~~~~~~~~~
 &temp->P.Price, temp->P.Premium);
                 ~~~~~~~~~~~~~~~

(я знаю, он говорит main.cpp; это просто артефакт онлайн-компилятора, который я перевел в режим C.)

...