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ます。
  • cargs通常は名前が付けられ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")
  • ディレクトリへのアクセス許可がありません
  • メモリが不足しています。(これはありそうにありません。)
于 2010-08-24T07:12:40.863 に答える
2

Cプログラム実行可能ファイルに渡されるパラメーターは、文字列(または文字ポインター)の配列にすぎないため、プログラムがこれらのパラメーターにアクセスする前に、これらの入力パラメーターにメモリーが既に割り当てられているため、バッファーを割り当てる必要はありません。プログラムのエラー処理コードも避けてください(segfaultの可能性を減らしてください:))。

于 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 に答える