18

我通过命令行输入接受路径。

当我做

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
4

4 回答 4

50

你真的应该发布你的代码(a),但是这里有。从以下内容开始:

    #include <stdio.h>
    #include <dirent.h>

    int main (int argc, char *argv[]) {
        struct dirent *pDirent;
        DIR *pDir;

        // Ensure correct argument count.

        if (argc != 2) {
            printf ("Usage: testprog <dirname>\n");
            return 1;
        }

        // Ensure we can open directory.

        pDir = opendir (argv[1]);
        if (pDir == NULL) {
            printf ("Cannot open directory '%s'\n", argv[1]);
            return 1;
        }

        // Process each entry.

        while ((pDirent = readdir(pDir)) != NULL) {
            printf ("[%s]\n", pDirent->d_name);
        }

        // Close directory and exit.

        closedir (pDir);
        return 0;
    }

您需要检查args[1]已设置并引用实际目录的案例。一个示例运行,它tmp是我当前目录的一个子目录,但你可以使用任何有效的目录,给我:testprog 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(argv[1]))如果初始diropen失败,你可以尝试使用)。


(a)现在已经纠正了这个问题,但是,由于这个答案已被接受,我将假设这是你传入的任何问题。

于 2010-08-24T07:03:41.423 回答
3

关于代码段的一些反馈,但在大多数情况下,它应该可以工作......

void main(int c,char **args)
  • int main- 标准定义main为返回一个int.
  • candargs通常被命名为argcand 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")
  • 您缺乏对该目录的权限
  • 内存不足。(这不太可能。)
于 2010-08-24T07:12:40.863 回答
2

传递给 C 程序可执行文件的参数只不过是一个字符串数组(或字符指针),因此在您的程序访问这些参数之前,已经为这些输入参数分配了内存,因此无需分配缓冲区,这样您就可以避免程序中的错误处理代码(减少段错误的机会:))。

于 2010-08-24T11:18:54.427 回答
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);
     }
于 2016-07-25T09:17:00.483 回答