我接受命令行输入的路径。
当我这样做时
dir=opendir(args[1]);
它不会进入循环...即dir==null
...
如何将命令行输入传递给dir指针?
void main(int c,char **args)
{
DIR *dir;
struct dirent *dent;
char buffer[50];
strcpy(buffer, args[1]);
dir = opendir(buffer); //this part
if(dir!=NULL)
{
while((dent=readdir(dir))!=NULL)
printf(dent->d_name);
}
close(dir);
}
./a.out /root/TEST is used to run the program..
./a.out --> to execute the program
/root/TEST --> input by the user i.e valid path
答案 0 :(得分:40)
你应该真的发布你的代码,但是这里。从:
开始 #include <stdio.h>
#include <dirent.h>
int main (int c, char *v[]) {
int len;
struct dirent *pDirent;
DIR *pDir;
if (c < 2) {
printf ("Usage: testprog <dirname>\n");
return 1;
}
pDir = opendir (v[1]);
if (pDir == NULL) {
printf ("Cannot open directory '%s'\n", v[1]);
return 1;
}
while ((pDirent = readdir(pDir)) != NULL) {
printf ("[%s]\n", pDirent->d_name);
}
closedir (pDir);
return 0;
}
您需要检查案例args[1]
是否已设置并引用实际目录。当运行时:
testprog tmp
(tmp
是我当前目录下的子目录,但您可以使用任何有效目录),我得到:
[.]
[..]
[file1.txt]
[file1_file1.txt]
[file2.avi]
[file2_file2.avi]
[file3.b.txt]
[file3_file3.b.txt]
请注意,您必须传入目录,而不是文件。执行时:
testprog tmp/file1.txt
我明白了:
Cannot open directory 'tmp/file1.txt'
因为这是一个文件而不是一个目录(如果你是偷偷摸摸的,如果初始diropen(dirname(v[1]))
失败,你可以尝试使用diropen
。
答案 1 :(得分:2)
传递给C程序可执行文件的参数只是一个字符串(或字符指针)数组,因此在程序访问这些参数之前,已经为这些输入参数分配了内存,因此不需要分配缓冲区,你也可以避免程序中的错误处理代码(减少段错误的几率:))。
答案 2 :(得分:1)
关于代码段的一些反馈,尽管在大多数情况下,它应该有用......
void main(int c,char **args)
int main
- 标准将main
定义为返回int
。c
和args
通常分别命名为argc
和argv
,但您可以为其命名...
{
DIR *dir;
struct dirent *dent;
char buffer[50];
strcpy(buffer,args[1]);
args[1]
超过50个字节,buffer
将无法保留它,并且您将写入不应该存储的内存。我没有理由在这里复制缓冲区,因此您可以通过不使用strcpy
来回避这些问题...... ...
dir=opendir(buffer); //this part
如果返回NULL
,可能有以下几个原因:
./your_program my directory
,这将失败,因为它会尝试opendir("my")
)答案 3 :(得分:0)
以下是使用ls
实现c
命令的简单方法。要运行使用,例如./xls /tmp
#include<stdio.h>
#include <dirent.h>
void main(int argc,char *argv[])
{
DIR *dir;
struct dirent *dent;
dir = opendir(argv[1]);
if(dir!=NULL)
{
while((dent=readdir(dir))!=NULL)
{
if((strcmp(dent->d_name,".")==0 || strcmp(dent->d_name,"..")==0 || (*dent->d_name) == '.' ))
{
}
else
{
printf(dent->d_name);
printf("\n");
}
}
}
close(dir);
}