I'm trying to make a minishell and store all the commands the user types, and when the user enters history it should display all the commands the user has typed so far, and when the user types history -c then it should clear the linked list.
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#include <signal.h>
#include <sys/wait.h>
typedef struct node
{
char* data;
struct node *next;
} node;
node *create_node(char* data)
{
node *ptr = malloc(sizeof(node));
if (ptr == NULL)
{
fprintf(stderr, "Error: Out of memory in create_node()\n");
exit(1);
}
ptr->data = data;
ptr->next = NULL;
return ptr;
}
node *insert_node(node *head, char* data)
{
node *temp;
if (head == NULL)
return create_node(data);
temp = head;
while (temp->next != NULL)
{
temp = temp->next;
}
// 'temp' is pointing to the last node in the list now.
temp->next = create_node(data);
return head;
}
void print_list(node *head)
{
node *temp;
if (head == NULL)
{
printf("(empty list)\n");
return;
}
for (temp = head; temp != NULL; temp = temp->next)
printf("%s%c", (char*)temp->data, '\n');
}
int main (int argc, char ** argv)
{
char buf[1024];
char * args[MAX_ARGS];
char ** arg;
node *head = NULL;
while (1)
{
printf("#");
if (fgets (buf, 1024, stdin ))
{
head = insert_node(head, buf);
arg = args;
*arg++ = strtok(buf, SEPARATORS); // tokenize input
while ((*arg++ = strtok(NULL, SEPARATORS)));
if (args[0])
{
//#byebye command, exist the while loop.
if (!strcmp(args[0], "byebye")) {
break;
}
if (!strcmp(args[0], "history"))
{
// command history with flag c
if (args[1] && !strcmp(args[1], "-c"))
{
// clear the linked list
}
else
{
print_list(head);
printf("\n");
}
continue;
}
arg = args;
while (*arg) fprintf(stdout, "%s ", *arg++);
fputs ("\n", stdout);
}
}
}
return 0;
}
But this is my output:
#hello hello #adding adding #to list to list #history history history history history
So, instead of printing out all the commands, it prints out history and I don't know what I am doing wrong. Please help, it has been awhile since I touched C and pointers.
ptr->data = malloc(sizeof(char*)); ptr->data = (char*)data;is a bit strange. That is a very small allocation, and, if you are you trying to copy a string, that just overwrites the pointer to the memory just allocated. The code is very hard to read though: far too much whitespace.create_nodeyou just assign *data to thenode->data. you made no copycreate_node. You allocate a new node BUT you assign the data pointer passed in to the data pointer in the node. There is no character copy. Look at how @Remy Lebeau did it