我尝试编写“ls”unix命令。 我将数据信息保存在链表中,但是当我想要打印这个链表时,她就会出错:
我如何获取数据?
#include "ft_ls.h"
static void my_lstadd(t_data **alst, t_data *new)
{
new->next = (*alst);
(*alst) = new;
}
static void ft_getstat(char *this, t_data **data)
{
struct stat fstat;
struct passwd *duser;
struct group *dgroup;
t_data *tmp;
if (stat(this, &fstat) == -1)
{
perror("");
exit(0);
}
tmp = (t_data*)malloc(sizeof(t_data));
duser = getpwuid(fstat.st_uid);
dgroup = getgrgid(fstat.st_gid);
tmp->name = ft_strdup(this);
tmp->type = ft_type(this);
tmp->right = ft_right(fstat);
tmp->link = fstat.st_nlink;
tmp->owner = ft_strdup(duser->pw_name);
tmp->grp = ft_strdup(dgroup->gr_name);
tmp->size = fstat.st_size;
tmp->date = ft_date_converter(ctime(&fstat.st_mtime));
my_lstadd(data, tmp);
}
t_data *ft_getdata(char *dirname, int option)
{
t_data *data;
int i;
DIR *dir;
struct dirent *file;
i = 0;
dir = opendir(dirname);
while ((file = readdir(dir)))
{
if (option == 1)
ft_getstat(file->d_name, &data);
else if (file->d_name[0] != '.')
ft_getstat(file->d_name, &data);
}
closedir(dir);
return (data);
}
我的打印功能-l选项:
#include "ft_ls.h"
static void ft_get_right(t_data *data)
{
ft_putchar('\n');
ft_putchar(ft_type(data->name));
ft_putright(data->right);
ft_print_space(3, data->link);
}
void ft_print_l(t_data **data)
{
t_data *ptrdata;
ptrdata = *data;
while (ptrdata)
{
ft_get_right(ptrdata);
ft_putnbr(ptrdata->link);
ft_putchar(' ');
ft_putstr(ptrdata->owner);
ft_putchar(' ');
ft_putstr(ptrdata->grp);
ft_print_space(6, ptrdata->size);
ft_putnbr(ptrdata->size);
ft_putchar(' ');
ft_putstr(ptrdata->date);
ft_putchar(' ');
ft_putstr(ptrdata->name);
ptrdata = ptrdata->next;
}
}
结果:
./ft_ls -l
-rw-r--r-- 1 cgaspart 2017_paris 0 Jan 4 15:26 zebulo
drwxr-xr-x 14 cgaspart 2017_paris 476 Jan 31 13:50 src
drwxr-xr-x 15 cgaspart 2017_paris 510 Feb 2 08:00 obj
-rw-r--r-- 1 cgaspart 2017_paris 1758 Jan 30 10:03 Makefile
drwxr-xr-x 67 cgaspart 2017_paris 2278 Jan 31 13:48 libft
drwxr-xr-x 3 cgaspart 2017_paris 102 Jan 31 12:23 include
-rwxr-xr-x 1 cgaspart 2017_paris 14464 Feb 2 08:00 ft_ls
-rw-r--r-- 1 cgaspart 2017_paris 8 Jan 4 15:26 auteur[1] 42763 segmentation fault ./ft_ls -l
我猜我的打印功能中的“ptrdata”永远不会为NULL然后“while”永远不会停止。我尝试在ft_getstat中设置tmp->旁边的NULL,但这不起作用。