2016-09-07 9 views
-1

enter image description herechar配列は、出力からのCの最初のループの後、いくつかのガベージ

while((entry = readdir(dir_pointer)) != NULL) 
     { 
       char *fullpath = malloc(dir_len + strlen(entry->d_name) + 2); 
       printf("\nfullpath: %s\n", fullpath); 
       strcat(fullpath, dir); // concatenate file directory; 
       printf("\ndir: %s\n",fullpath); 
       strcat(fullpath, "/"); // concatenate "/"; 
       strcat(fullpath, entry->d_name); // concatenate filename; 
       printf("\nfullpath: %s\n", fullpath); // print to check; 

       free(fullpath); 
       // close the file; 



     } 

を有し、ファイルの完全なパスが正しいループが正常に動作している間の最初のラウンドです。

しかし、第二ラウンドのために、ファイルの完全なパスは、いくつかのゴミが含まれ、

はどこごみから来たのでしょうか?

これを解決するには、memset()を試しましたが、動作しませんでした。

+1

'strcat()'を呼び出すと、新しく 'malloc()'に初期化されていない配列が追加されます...これは、nullバイトで始まる場合すべて保証されています)。 – Dmitri

+1

簡単な修正は、最初の 'strcat()'を 'strcpy()'に変更することです(また、その未初期化文字列を印刷しようとする前に 'printf()'を取り除くだけです)。 – Dmitri

+0

@上記のどれも: 'snprintf()'。 –

答えて

4

fullpathは初期化されていません。この場合はstrcat()を使用する必要はありませんが、最初にstrcat()の最初のパラメータを有効な文字列にするだけで、空の文字列にすることができます。

その直後malloc()

if (fullpath == NULL) 
    exit(-1); 
fullpath[0] = '\0'; 

した後、あなたはstrcat()への最初のパラメータとしてfullpath使用することができます。

あなたはstrcat()はそれがnullターミネータをチェックする最初のPARAMTERをスキャンするために使用することが悪いです、見たが、あなたのケースでfullpathの内容はundeterminateあり、それは最初の文字が'\0'であることが起こるかもしれませんが、保証はありません。

文字列を渡すたびに'\0'ターミネーターを検索すると、恐らく伸びているstrcat()には効率が悪くなります。

また、ループ内でfree()fullpathに行くので、malloc()はまったく使用しないでください。 VLA(可変長配列)または固定長1を使用することもできます。 malloc()free()を呼び出すのは安価ではないので、すでにstrcpy()以上が必要です。この場合はsnprintf()が適しています。

+0

ありがとうございました。また、アドバイスもありがとうございます。 – Patrick

関連する問題