2

This is my first attempt at making a c program in VsCode and I couldn't understand why it keeps giving me this warning:

  • return type defaults to 'int' [-Wimplicit-int]
  • passing argument 1 of 'DeleteListId' makes integer from pointer without a cast [-Wint-conversion]
  • variable 'Phead' set but not used [-Wunused-but-set-variable]
  • passing argument 2 of 'strcmp' makes pointer from integer without a cast [-Wint-conversion]
  • passing argument 2 of 'strcmp' makes pointer from integer without a cast [-Wint-conversion]

This is the code so far:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct STRUCT
{
    char FIRSTNAME[20];
    char LASTNAME[20];
    char CIVILLID[13];
    int Day, month, Year;
    int FirstShot;
    int SecondShot;
    char NameVaccTaken[20];
};


struct Node
{
    char FIRSTNAME[20];
    char LASTNAME[20];
    char CIVILLID[13];
    int Day, month, Year;
    int FirstShot;
    int SecondShot;
    char NameVaccTaken[20];
    struct Node *next;
    struct Node *prev;
};

struct QNode
{
    char FIRSTNAME[20];
    char LASTNAME[20];
    char CIVILLID[13];
    int Day, month, Year;
    int FirstShot;
    int SecondShot;
    char NameVaccTaken[20];
    struct QNode *next;
    
};

struct Node *NeNode = NULL;
struct Node *Phead = NULL;
struct Node *head, *Phead;
struct QNode *QR = NULL;
struct QNode *front, *rear;
struct QNode *DelNodQ, *FooQ, *Foo, *Q;
void EnqueueCiti();
void DequeueCiti();
void Print_Citi();
int main();
int TxtF();
int Menu_Linked_List();
int Menu_Linked_Queue();
void FillData();
int FCount = 0;
struct STRUCT TokenArray[50];
void Create_List_From_File();
void Create_Queue_From_File();
void Insert_New_Citz_List();
void PrintListData();
void PrintListDataDS(int dose);
int DeleteListId(int Search);
void create_DLL();

int main()
{
    int C = 0;
    system("cls");
    printf("\n\n      \t++++++++++++++++++++++++++++++++++++++++++\n");
    printf("    \tWelcome to vaccination information system \n");
    printf("      \t++++++++++++++++++++++++++++++++++++++++++\n");
    printf("  \t\t++++++++++++++++++++++++++\n");
    printf("    \t\t  Project Main Menu\n");
    printf("  \t\t++++++++++++++++++++++++++\n");
    printf("   \t\t1. Read File Menu\n");
    printf("   \t\t2. Doubly Linked list Menu\n");
    printf("   \t\t3. linked Queue Menu \n");
    printf("   \t\t4. Exit ");
    printf("\n  \t\t++++++++++++++++++++++++++\n");
    printf("\n\nChoice :");

    scanf("%d", &C);
    switch (C)
    {
    case 1:
        printf("\n");
        return TxtF();
    case 2:
        printf("\n");
        return Menu_Linked_List();
    case 3:
        printf("\n");
        return Menu_Linked_Queue();
    case 4:
        return 0;
    default:
        printf("Invalid \n");
        return main();

    }

    return main();
}

int TxtF()
{
    int opn;
    system("cls");
    printf("\n\n   Open citizens File  \n");
    printf("   1-Load txt File\n");
    printf("   2-Back\n");
    while (1)
    {
        printf("\n\nChoice :");
        scanf("%d", &opn);
        switch (opn)
        {
        case 1:
            FillData();Create_List_From_File();Create_Queue_From_File();
            break;
        case 2:
            return main();
        default: printf("\n\nWrong choice.. \n\n");
            break;
        }
    }
    return 0;
}


void FillData()
{
    FILE * file;
    char FrLine[999];
    int i, Col;
    char* token;
    file = fopen("ProjText.txt", "r");
    FCount = 0;

    if (file != NULL)
    {
        while (fgets(FrLine, 100, file))
        {
            i = 0;
            Col = 0;
            token = strtok(FrLine, ",");

            while (token != NULL)
            {
                Col++;
                if (Col == 1)
                {
                    strcpy(TokenArray[FCount].FIRSTNAME, token);
                }
                else if (Col == 2)
                {
                    strcpy(TokenArray[FCount].LASTNAME, token);
                }
                else if (Col == 3)
                {
                    strcpy(TokenArray[FCount].CIVILLID, token);
                }
                else if (Col == 4)
                {
                    TokenArray[FCount].FirstShot = atoi(token);
                }
                else if (Col == 5)
                {
                    TokenArray[FCount].SecondShot = atoi(token);
                }
                else if (Col == 6)
                {
                    TokenArray[FCount].Day = atoi(token);
                }
                else if (Col == 7)
                {
                    TokenArray[FCount].month = atoi(token);
                }
                else if (Col == 8)
                {
                    TokenArray[FCount].Year = atoi(token);
                }
                else if (Col == 9)
                {
                    strcpy(TokenArray[FCount].NameVaccTaken, token);
                }

                token = strtok(NULL, ",");

            }
            FCount++;
        }
    }
    fclose(file);
    printf("\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
    printf("  NAME   \tCIVID  \t\tFirstShot\tSecondShot \t Vacc Date \tVacc Name");
    printf("\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
    i = 0;
    while (i<FCount)
    {
        printf("%s\t%s \t %s \t  %d \t \t%d \t\t%d %d %d \t%s",
            TokenArray[i].FIRSTNAME, TokenArray[i].LASTNAME, TokenArray[i].CIVILLID, 
            TokenArray[i].FirstShot, TokenArray[i].SecondShot, TokenArray[i].Day, 
            TokenArray[i].month, TokenArray[i].Year, TokenArray[i].NameVaccTaken);
        i++;
    }
    printf("\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
}

void Create_List_From_File()
{
    struct Node *current;
    head = current = NULL;
    int i;
    for (i = 0; i<FCount; i++)
    {
        struct Node *Node = (struct Node*) malloc(sizeof(struct Node));
        strcpy(Node->FIRSTNAME, TokenArray[i].FIRSTNAME);
        strcpy(Node->LASTNAME, TokenArray[i].LASTNAME);
        strcpy(Node->CIVILLID, TokenArray[i].CIVILLID);
        Node->FirstShot = TokenArray[i].FirstShot;
        Node->SecondShot = TokenArray[i].SecondShot;
        Node->Day = TokenArray[i].Day;
        Node->month = TokenArray[i].month;
        Node->Year = TokenArray[i].Year;
        strcpy(Node->NameVaccTaken, TokenArray[i].NameVaccTaken);

        Node->next = NULL;

        if (head == NULL)
            head = Node;
        else
        {
            Node->next = head;
            Node->next->prev = Node;
            head = Node;
        }

    }

}

void Create_Queue_From_File()
{
    int i;
    for (i = 0; i<FCount; i++)
    {
        FooQ = (struct QNode *)malloc(1 * sizeof(struct QNode));
        strcpy(FooQ->FIRSTNAME, TokenArray[i].FIRSTNAME);
        strcpy(FooQ->LASTNAME, TokenArray[i].LASTNAME);
        strcpy(FooQ->CIVILLID, TokenArray[i].CIVILLID);
        FooQ->FirstShot = TokenArray[i].FirstShot;
        FooQ->SecondShot = TokenArray[i].SecondShot;
        FooQ->Day = TokenArray[i].Day;
        FooQ->month = TokenArray[i].month;
        FooQ->Year = TokenArray[i].Year;
        strcpy(FooQ->NameVaccTaken, TokenArray[i].NameVaccTaken);


        if (rear == NULL)
        {
            rear = (struct QNode *)malloc(1 * sizeof(struct QNode));
            strcpy(rear->FIRSTNAME, FooQ->FIRSTNAME);
            strcpy(rear->LASTNAME, FooQ->LASTNAME);
            strcpy(rear->CIVILLID, FooQ->CIVILLID);
            rear->FirstShot = FooQ->FirstShot;
            rear->SecondShot = FooQ->SecondShot;
            rear->Day = FooQ->Day;
            rear->month = FooQ->month;
            rear->Year = FooQ->Year;
            strcpy(rear->NameVaccTaken, FooQ->NameVaccTaken);


            rear->next = NULL;
            front = rear;
        }
        else
        {
            rear->next = FooQ;
            FooQ->next = NULL;
            rear = FooQ;
        }
    }

}


int Menu_Linked_List()
{
    int ch;
    char Search[12];
    int check;
    int dose;
    system("cls");
    printf("\n\n  \t++++++++++++++++++++++++++\n");
    printf("         Doubly Linked list    ");
    printf("\n  \t++++++++++++++++++++++++++");
    printf("\n\t 1 - Insert new entry");
    printf("\n\t 2 - Delete By Civil ID");
    printf("\n\t 3 - Display all ");
    printf("\n\t 4 - Display all entries by doses");
    printf("\n\t 5 - Back\n");
    printf("  \t++++++++++++++++++++++++++\n");

    while (1)
    {
        printf("\n\nChoice : ");
        scanf("%d", &ch);
        switch (ch)
        {
        case 1: Insert_New_Citz_List();

            break;
        case 2:getchar();
            printf("\nEnter Civil ID : ");
            gets(Search);
            check = DeleteListId(Search);
            if (check)
                printf("%s was deleted \n", Search);
            else
                printf("%s Not found \n", Search);
            break;
        case 3:PrintListData();
            break;
        case 4:printf("\nEnter number of doses to check the entries : ");
            scanf("%d", &dose);
            PrintListDataDS(dose);
            break;
        case 5:return main();
        default: printf("\n Wrong choice...");
        }
    }
    return 0;
}


void create_DLL()
{
    NeNode = (struct Node *)malloc(1 * sizeof(struct Node));
    NeNode->prev = NULL;
    NeNode->next = NULL;
    getchar();
    printf("First name : ");
    gets(NeNode->FIRSTNAME);
    printf("Last name : ");
    gets(NeNode->LASTNAME);
    printf("Civil ID : ");
    gets(NeNode->CIVILLID);
    printf("Number of doses taken : ");
    scanf("%d", &NeNode->FirstShot);
    printf("Number of doses to be taken : ");
    scanf("%d", &NeNode->SecondShot);
    printf("Next vaccination Date : ");
    scanf("%d%d%d", &NeNode->Day, &NeNode->month, &NeNode->Year);
    getchar();
    printf("vaccination name : ");
    gets(NeNode->NameVaccTaken);

}



void Insert_New_Citz_List()
{
    struct Node *Phead = head;
    struct Node *CUR;
    create_DLL();
    if (head == NULL)
    {
        head = NeNode;
        Phead = head->next;
    }
    else
    {
        CUR = head;
        while (CUR->next != NULL)
        {
            CUR = CUR->next;
        }

        CUR->next = NeNode;
        NeNode->prev = CUR;
    }
}




int DeleteListId(int Search)
{
    struct Node *prev, *cur;
    int CIVILLIDChechk = 0;

    while (head != NULL && strcmp(head->CIVILLID, Search) == 0)
    {
        prev = head;
        head = head->next;
        free(prev);
        CIVILLIDChechk = 1;
    }
    prev = NULL;
    cur = head;
    while (cur != NULL)
    {
        if (strcmp(cur->CIVILLID, Search) == 0)
        {
            if (prev != NULL)
            {
                prev->next = cur->next;
            }
            free(cur);
            cur = prev->next;
            CIVILLIDChechk = 1;
        }
        else
        {
            prev = cur;
            cur = cur->next;
        }
    }
    return CIVILLIDChechk;
}


void PrintListData()
{
    struct Node *PriFoo = head;
    if (head == NULL)
    {
        printf("List is empty.. \n");
        return;
    }
    printf("\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
    printf("  NAME   \tCIVID  \t\tFirstShot\tSecondShot \t Vacc Date \tVacc Name");
    printf("\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
    PriFoo = head;
    while (PriFoo != NULL)
    {
        printf("%s\t%s \t %s \t  %d \t \t%d \t\t%d %d %d \t%s\n", PriFoo->FIRSTNAME, PriFoo->LASTNAME, PriFoo->CIVILLID, PriFoo->FirstShot, PriFoo->SecondShot, PriFoo->Day, PriFoo->month, PriFoo->Year,
            PriFoo->NameVaccTaken);

        PriFoo = PriFoo->next;
    }
    printf("\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");

}
void PrintListDataDS(int dose)
{
    struct Node *PriFoo = head;
    if (head == NULL)
    {
        printf("List is empty.. \n");
        return;
    }
    printf("\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
    printf("  NAME   \tCIVID  \t\tFirstShot\tSecondShot \t Vacc Date \tVacc Name");
    printf("\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
    PriFoo = head;
    while (PriFoo != NULL)
    {
        if (PriFoo->FirstShot == dose)
            printf("%s\t%s \t %s \t  %d \t \t%d \t\t%d %d %d \t%s\n", PriFoo->FIRSTNAME, PriFoo->LASTNAME, PriFoo->CIVILLID, PriFoo->FirstShot, PriFoo->SecondShot, PriFoo->Day, PriFoo->month, PriFoo->Year, PriFoo->NameVaccTaken);
        PriFoo = PriFoo->next;
    }
    printf("\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");


}




int Menu_Linked_Queue()
{

    int choice;
    system("cls");
    printf("\n\n  \t++++++++++++++++++++++++++\n");
    printf("              Linked Queue    \n");
    printf("  \t++++++++++++++++++++++++++");
    printf("\n \t1- Enqueue ");
    printf("\n \t2- Dequeue ");
    printf("\n \t3- View  ");
    printf("\n \t4- Back\n");
    printf("  \t++++++++++++++++++++++++++\n");
    while (1)
    {
        printf("\nChoice : ");
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:
            EnqueueCiti();
            break;
        case 2:
            DequeueCiti();
            break;
        case 3:
            Print_Citi();
            break;
        case 4:
            return main();
        default:printf("Wrong choice..\n");break;
        }
    }
    return 0;
}




void EnqueueCiti()
{
    Foo = (struct QNode *)malloc(1 * sizeof(struct QNode));
    getchar();
    printf("First name : ");
    gets(Foo->FIRSTNAME);
    printf("Last name : ");
    gets(Foo->LASTNAME);
    printf("Civil ID : ");
    gets(Foo->CIVILLID);
    printf("Number of doses taken : ");
    scanf("%d", &Foo->FirstShot);
    printf("Number of doses to be taken : ");
    scanf("%d", &Foo->SecondShot);
    printf("Next vaccination Date : ");
    scanf("%d%d%d", &Foo->Day, &Foo->month, &Foo->Year);
    getchar();
    printf("vaccination name : ");
    gets(Foo->NameVaccTaken);

    rear->next = Foo;
    Foo->next = NULL;
    rear = Foo;

}


void Print_Citi()
{
    if ((front == NULL) && (rear == NULL))
    {
        printf("Queue is empty to display .");
        return;
    }
    printf("\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
    printf("  NAME   \tCIVID  \t\tFirstShot\tSecondShot \t Vacc Date \tVacc Name");
    printf("\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
    for (QR = front; QR != NULL; QR = QR->next)
        printf("%s\t%s \t %s \t  %d \t \t%d \t\t%d %d %d \t%s\n", QR->FIRSTNAME, QR->LASTNAME, QR->CIVILLID, QR->FirstShot, QR->SecondShot, QR->Day, QR->month, QR->Year
            , QR->NameVaccTaken);
    printf("\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");

}

void DequeueCiti()
{

    DelNodQ = front;

    if (DelNodQ == NULL)
    {
        printf("Queue is empty to display .");
        return;
    }
    else
        if (DelNodQ->next != NULL)
        {
            DelNodQ = DelNodQ->next;
            printf("%s\t%s \t %s \t  %d \t \t%d \t\t%d %d %d \t%s\n", front->FIRSTNAME, front->LASTNAME, front->CIVILLID, front->FirstShot, 
                  front->SecondShot, front->Day, front->month, front->Year, front->NameVaccTaken);
            free(front);
            front = DelNodQ;
        }
        else
        {
            printf("%s\t%s \t %s \t  %d \t \t%d \t\t%d %d %d \t%s\n", front->FIRSTNAME, front->LASTNAME, front->CIVILLID, front->FirstShot,
                front->SecondShot, front->Day, front->month, front->Year, front->NameVaccTaken);
            free(front);
            front = NULL;
            rear = NULL;
        }

}
RuNaBa 22
  • 21
  • 2
  • Do you get the same errors in the environment you used before? – Yunnosch Dec 27 '21 at 07:10
  • Please clarify which error message occurs for which line. Do not use line numbers however, they are unreliable. Write comments into the code. And otherwise please quote the messages fully, as text and verbatim. – Yunnosch Dec 27 '21 at 07:11

1 Answers1

0
int DeleteListId(int Search)

It looks like you wanted Search to be a string (const char *) instead.

Other bugs:

  • Calling main recursively on invalid input is unwise; a long enough sequence of invalid inputs will crash your program with a stack overflow. Rewrite with a loop.

  • Never use gets. Never. Never. I don't care if you "trust all your inputs" or "nobody else will ever use this program". Never.

  • On similar lines, strcpy(TokenArray[FCount].FIRSTNAME, token);: token may be as long as 100 characters, and the destination can hold only 20. That's a buffer overflow vulnerability. All your strcpy instances should be checked for possible overflows, and fixed. Yes, strcpy by itself is convenient, but habits like this are how people wind up being responsible for major security breaches.

  • In all your declarations like int TxtF();: This doesn't declare TxtF as a function taking no arguments, it defines it as a function taking unspecified arguments. (It would be what you want in C++ - but C is not C++.) If you were to try to call TxtF with arguments, the compiler would not stop you, but undefined behavior would occur at runtime. Make it int TxtF(void); and change all similar instances. See func() vs func(void) in C99 for more details.

  • variable 'Phead' set but not used: You write to this variable but never read it. So why did you create it in the first place? Maybe you meant to use it for something but forgot. Recheck the code in this function carefully.

  • In fillData, if the fopen fails, you will call fclose(file) with file == NULL and crash. The fclose probably wants to be inside the if (file != NULL) block.

Nate Eldredge
  • 48,811
  • 6
  • 54
  • 82