2017-09-14 8 views
-2

以下のコードを使用して、ディレクトリ内のファイルを一覧表示しています。カンマで区切った文字列にファイル名を追加するにはどうすればよいですか?これを行うにはカンマ区切り文字列にファイル名を追加する方法

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

int main(void) 
{ 
    DIR   *d; 
    struct dirent *dir; 
    d = opendir("/home/test/filename_test"); 
    char *start = ""; 
    char *filename_list = strdup(start); 

    if (d) 
    { 
    while ((dir = readdir(d)) != NULL) 
    { 
     int size = sizeof(dir->d_name); 

     printf("%s\n", dir->d_name); 

     printf("size of name is %d\n",size); 
    } 

    closedir(d); 
    } 

    return(0); 
} 
+1

バッファを割り当て、 'sprintf()'を使ってください。 –

+0

本当に文字列として作成しますか?または、コンマで区切ってコンソールに表示したいだけですか? – BLUEPIXY

答えて

0

一つの簡単っぽい方法は

  • があなたのループの前のstrdup( "")を使用して、ゼロ文字、NULLで終了するchar *を割り当てるある

  • それを増やします各反復でサイズが変更されます。 realloc()を使ってこれを行うことができます。これは既存のコンテンツを保存し、さらに追加する余地を作ります。古いバッファの長さ、ファイル名の長さ、カンマの長さ、最後の0の長さを追加することで、新しいバッファの長さを計算できます。

  • ファイル名などをバッファはstrcat()を使用しています。

あなたはそれは、ファイル名が続かない、リストの末尾にコンマを入れて回避するために、いくつかのロジックが必要になります。

このアプローチの問題は、繰り返し再割り当てが行われるため、一部のシステムでは非効率的になる可能性があることです。より良いアプローチは、反復処理の際にチャンクでサイズを変更するバッファを使用することです。しかし、もしそれをやろうとすれば、おそらくCのためにすでに存在する多くの文字列処理ライブラリの1つを使う方が簡単かもしれません。

+0

こんにちはKevin私はあなたの提案を実装しようとしています。上のコードでは、ファイル名のサイズが256として表示されています。構造体へのポインタを逆参照するときに、演算子のサイズを使用できますか?おかげで –

+0

私は何かが不足している場合は申し訳ありませんが、私はなぜ構造体のサイズが必要かわからない。あなたが与えたコード例では、それを行う必要はありませんでした。 _any_ポインタに 'sizeof()'を適用すると、ポインタが使用するメモリ量が得られます。これは便利なこともありますが、ここでなぜ必要なのかわかりません。人々が見るためのいくつかのコードを投稿するのが良いと思います。 –

+0

こんにちはKevin、間違いですが、私は 'dir-> d_name'に' sizeof() 'を使っていましたが、ポインタが取り上げるメモリの量を返します。私がこれをやろうと思ったのは、 'realloc()'にサイズを渡す必要があったからです。しかし、私は 'dir-> d_name'にcharの数と他のアイテムのサイズを渡す必要がありました。 –

関連する問題