struct nouedls
{
char * path;
char * name;
struct nouedls * suiv;
};
typedef struct nouedls nouedls;
typedef nouedls * listes;
listes ajouters(listes ls, char * path , char* name)
{
nouedls * x=malloc(sizeof(x));
listes auxl;
x->path=malloc(strlen(path)*sizeof(char));
x->name=malloc(strlen(name)*sizeof(char));
strcpy(x->path,path);
strcpy(x->name,name);
x->suiv=NULL;
if (ls==NULL){
ls=x;
}
else
{
auxl=ls;
while(auxl->suiv!=NULL)
{
auxl=auxl->suiv;
}
auxl->suiv=x;
}
return(ls);
}
void makepath(char* path){
char ch2 [400];
int i=0 ;
int k=0 ;
while (path[i]!='n')
{
if (path[i]!='\')
{
ch2[k]=path[i] ;
i++ ;
k++ ;
}
else
{
ch2[k]=path[i] ;
k++ ;
ch2[k]='\' ;
k++ ;
i++ ;
}
}
ch2[k]=' ' ;
}
void menu (char*path){
FILE *fp;
char *fname = "MyScript.bat";
FILE *f ;
listes menu=malloc(sizeof(menu)) ;
char upath [400];
char name [260] ;
menu=NULL ;
if ((fp = fopen(fname, "wt")) == NULL)
{fatal("Cannot open script file");}
makebatfd(fp, "MyDirectory",path);
if (fclose (fp))
{fatal("Cannot close script file");}
system("MyScript.bat>menu.txt");//make the menu .txt file
nom(path) ;//makes the name.txt file
if ((fp = fopen("menu.txt", "r+")) == NULL)
{fatal("Cannot open menu file");}
if ((f = fopen("name.txt", "r+")) == NULL)
{fatal("Cannot open name file");}
printf("path") ;
while (fgets(upath,400,fp)!= NULL )
{
makepath(upath) ;//it handles the character ''
fgets(name,260,f) ;
printf("%s",upath) ;
menu=ajouters(menu,upath,name) ;
printf("path") ;
}
if (fclose (f))
{fatal("Cannot close name file");}
if (fclose (fp))
{fatal("Cannot close menu file");}
}
menu
函数创建一个文件menu.txt
其中包含文件的路径,另一个文件name.txt
其中包含这些文件的名称。 我想使用函数将这些文件中包含的信息放在列表中,ajouters
它工作,但在某一行它崩溃了(我只放了我怀疑的函数, 因为其他人工作得很好(
我想
,你需要改变
要点 1:
nouedls * x=malloc(sizeof(x));
自
nouedls * x=malloc(sizeof(*x)); // *x == struct nouedls, x == struct nouedls *
要点 2:
x->path=malloc(strlen(path)*sizeof(char));
自
x->path=malloc(strlen(path) + 1); //+ 1 to hold the terminating null, sizeof(char) == 1 always.
同样。
此外,在使用返回的指针之前,必须检查 malloc()
的返回值是否成功。