当前位置: 技术问答>linux和unix
一段例目录下文件的程序(为何运行错误)
来源: 互联网 发布时间:2015-10-20
本文导语: #include"myh.h" static long diroff=0; char *getfiles(char *path) { DIR *dir; struct dirent *pdir; char buf[50]; if((dir=opendir(path))==NULL){ printf("n path error!n"); exit(-1);} do { seekdir(dir,diroff); pdir=read...
#include"myh.h"
static long diroff=0;
char *getfiles(char *path)
{
DIR *dir;
struct dirent *pdir;
char buf[50];
if((dir=opendir(path))==NULL){
printf("n path error!n");
exit(-1);}
do
{ seekdir(dir,diroff);
pdir=readdir(dir);
diroff=telldir(dir);
if(!strcmp(pdir->d_name,".")||!strcmp(pdir->d_name,".."))
continue;
return(pdir->d_name);
}while(pdir!=NULL);
closedir(dir);
/* if(pdir==NULL){
printf("n readfile error!n");
exit(-1);}
*/}
main(int argc,char *argv[])
{
char buff[80];
do {
strcpy(buff,getfiles(argv[1]));
printf(" %sn",buff);
}
while(buff!=NULL);
}
编译正常,运行也能实现功能就是最后报内存错误.
static long diroff=0;
char *getfiles(char *path)
{
DIR *dir;
struct dirent *pdir;
char buf[50];
if((dir=opendir(path))==NULL){
printf("n path error!n");
exit(-1);}
do
{ seekdir(dir,diroff);
pdir=readdir(dir);
diroff=telldir(dir);
if(!strcmp(pdir->d_name,".")||!strcmp(pdir->d_name,".."))
continue;
return(pdir->d_name);
}while(pdir!=NULL);
closedir(dir);
/* if(pdir==NULL){
printf("n readfile error!n");
exit(-1);}
*/}
main(int argc,char *argv[])
{
char buff[80];
do {
strcpy(buff,getfiles(argv[1]));
printf(" %sn",buff);
}
while(buff!=NULL);
}
编译正常,运行也能实现功能就是最后报内存错误.
|
我修改了你的程序
#include
#include
#include
static long diroff=0;
char *getfiles(char *path)
{
DIR *dir;
struct dirent *pdir;
char buf[50];
if ((dir=opendir(path))==NULL)
{
printf("n path error!n");
exit(-1);
}
do
{
seekdir(dir, diroff);
pdir=readdir(dir);
diroff = telldir(dir); // 0
if (pdir == NULL) break; // 1
if (!strcmp(pdir->d_name, ".")||!strcmp(pdir->d_name, "..")) // 2
continue;
closedir(dir);
return(pdir->d_name);
} while (pdir!=NULL);
closedir (dir);
return ""; // 3
}
main(int argc,char *argv[])
{
char buff[80];
do
{
strcpy(buff, getfiles(argv[1]));
printf(" %sn",buff);
} while (buff[0]); // 4
}
你的思路没有错误,但是以下几个方面要注意一下
1。在0处得到的pdir可能为空,所以在1处进行判断了,你的内存出错就是因为没有判断pdir为空,然后在2处调用了pdir->d_name,使得函数strcmp出错
2。如果没有返回值,应该返回空字符串,而不是空指针(3),如果返回空指针,strcpy将会出现内存错误,导致程序core dump。
3。opendir必须和closedir对应使用
#include
#include
#include
static long diroff=0;
char *getfiles(char *path)
{
DIR *dir;
struct dirent *pdir;
char buf[50];
if ((dir=opendir(path))==NULL)
{
printf("n path error!n");
exit(-1);
}
do
{
seekdir(dir, diroff);
pdir=readdir(dir);
diroff = telldir(dir); // 0
if (pdir == NULL) break; // 1
if (!strcmp(pdir->d_name, ".")||!strcmp(pdir->d_name, "..")) // 2
continue;
closedir(dir);
return(pdir->d_name);
} while (pdir!=NULL);
closedir (dir);
return ""; // 3
}
main(int argc,char *argv[])
{
char buff[80];
do
{
strcpy(buff, getfiles(argv[1]));
printf(" %sn",buff);
} while (buff[0]); // 4
}
你的思路没有错误,但是以下几个方面要注意一下
1。在0处得到的pdir可能为空,所以在1处进行判断了,你的内存出错就是因为没有判断pdir为空,然后在2处调用了pdir->d_name,使得函数strcmp出错
2。如果没有返回值,应该返回空字符串,而不是空指针(3),如果返回空指针,strcpy将会出现内存错误,导致程序core dump。
3。opendir必须和closedir对应使用
|
pdir=readdir(...)
if (pdir != NULL) // 加上这句
if (pdir != NULL) // 加上这句
|
你仔细阅读你的结构?有问题.
|
到最后你都把NULL付给path了.
|
正如LZ所说,getfiles中的循环是没有必要的