【发布时间】:2021-01-10 02:21:55
【问题描述】:
我正在尝试制作一个 minishell 并存储用户键入的所有命令,当用户输入 history 它应该显示用户迄今为止输入的所有命令,当用户输入 history -c 然后它应该清除链表。
#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;
}
但这是我的输出:
#你好 你好 #添加 添加 #列出 列出 #历史 历史 历史 历史 历史所以,不是打印出所有命令,而是打印出history,我不知道我做错了什么。请帮忙,我已经有一段时间没有接触 C 和指针了。
【问题讨论】:
-
ptr->data = malloc(sizeof(char*)); ptr->data = (char*)data;有点奇怪。这是一个非常小的分配,而且,如果你试图复制一个字符串,那只会覆盖指向刚刚分配的内存的指针。虽然代码很难阅读:太多的空格。 -
您是否尝试单步执行代码?
-
您所做的只是移动指针。你没有复制任何东西。在
create_node中,您只需将 *data 分配给node->data。你没有复制 -
看
create_node。您分配一个新节点,但您将传入的数据指针分配给节点中的数据指针。没有字符副本。看看@Remy Lebeau 是如何做到的 -
是的,我做了@Quimby,它似乎工作正常,因为我使用 print 语句来查看正在存储的字符串,它似乎工作正常,直到我输入历史并且突然所有链接列表都有历史作为数据而不是原始数据
标签: c string linked-list