2017-02-05 12 views
0

私はディレクトリ内のファイルを読み込み、各ファイル名を文字列の配列に格納しようとしています。私はそれを私の人生のために働かせることはできません。関数は次のとおりです。Cの配列に文字列を保存する

char *readFile(char *dir){ 
char *fileStringArray[1000]; 
DIR *dirPointer; 
int file_count = 0; 
struct dirent *file; 
struct stat fileType; 
int i = 0; 
if ((dirPointer = opendir(dir)) == NULL){ 
    printf("Directory not found, try again\n"); 
    return NULL; 
}else{ 
    printf("Reading files in directory\n"); 
    while((file = readdir(dirPointer)) != NULL){ //iterate through contents of directory 
    stat(dir, &fileType); 
     if(i > 1){ //ignore . and .. directories that appear first 
      file_count++; 
      printf("%s\n", file->d_name); 
      strcpy(fileStringArray[i-2], file->d_name); //crashes, replace 
      //with [i] to not crash, but i-2 makes more sense to me 
      //fileStringArray[i-2] = &file->d_name; alternate idea 
     } 
     else{ 
      i++; 
     } 
    } 
    int j; 
    for(j = 0; j < file_count; j++){ 
     printf(":::%s\n", fileStringArray[j]); //print the string array 
    } 
} 
printf("Done reading\n\n"); 
closedir(dirPointer); 
return dir; 
} 
+1

'fileStringArray'は、*初期化されていない*ポインタの配列です。これらの値( 'strcpy(fileStringArray [i-2]、file-> d_name)')にアクセスすると、未定義の振る舞いになります。最初に保存する文字列ごとにメモリを割り当てます。 – kaylum

+0

C本を読んでいますか?統計的には、本を読む人にはこの種の基本的な問題がないように思われるので、私は「いいえ」に私の賭けをします... – Sebivor

答えて

1

コードには2つの問題があります。主なものは、文字列へのポインターの1000要素配列に文字列を格納しようとすることです。 charへのポインタでは文字列を格納するには十分ではありませんが、実際にはあるメモリを指す必要があります。 strcpy関数をstrdupに変更することを検討してください。これはメモリを割り当てます。または、fileStringArrayを配列の文字数の配列(のchar fileStringArray [1000] [100])に変更する必要があります。

2番目の問題はiであるため、実際に配列を進めたい場合は、無条件にインクリメントする必要があります。

また、完全な例を投稿できればいいと思いますので、含めるヘッダーを推測する必要はありません。

+0

申し訳ありません、私のプロジェクトの残りの部分を投稿したくありません。 の#include の#include の#include の#include の#include の#include cowchin12

関連する問題