2

これはおそらく私が間違っている構文のことですが、私の人生ではそれを理解することはできません.

関連コード:

struct dirent *readDir;
DIR *dir;
dir = opendir(name);

if(dir == NULL) {
    printf("No directory found with the name %s\n", name);
} else {
    printf("directory named %s opened.\n", name);

    while((readDir = readdir(dir)) != NULL) {
        if(readDir->d_name != ".." || readDir->d_name != ".") {
            printf("%s\n", readDir->d_name);
        }
    }
    closedir(dir);
}

while ループの if 条件が機能していないようです。生成される出力は次のとおりです。

directory named test opened.
file2
.
test2
file1
..

私が間違っていなければ、if ステートメントは . および..ディレクトリですが、そうではありません。これの目標は、再帰的なディレクトリトラバーサルになることですが、. そして..私が本当に先に進むことができないディレクトリ。

基本的に、文字列を比較する方法がわかりません。

4

2 に答える 2

5

C は、文字列比較で '!=' または '==' をサポートしていません。strcmp()を使用します。

if(readDir->d_name != ".." || readDir->d_name != ".") {

する必要があります

if(strcmp(readDir->d_name, "..") && strcmp(readDir->d_name, ".")) {
    // d_name is not "." or ".."
}
于 2013-10-14T21:15:59.680 に答える
2

次の 2 つの問題があります。

if(readDir->d_name != ".." || readDir->d_name != ".") {

まず、C ではこの方法で文字列を比較することはできません...基本的に、文字列リテラルのアドレスが のアドレスと一致するかどうかを確認していますreadDir->d_name。代わりに次のような関数を使用する必要がありますstrcmp()

第二に、そのような条件を OR すると、式全体を true にするために 1 つだけが true である必要がありますd_name同時に、文字列比較が(おそらく) 期待どおりに機能したとしても、式全体は常に TRUE になります。

したがって、次のようなものが必要です。

if (strcmp("..", readDir->d_name) && strcmp(".", readDir->d_name)) {

(文字列が一致しないstrcmp()場合はゼロ以外を返すため、両方の文字列を一致させる必要はありません)。

于 2013-10-14T21:25:42.203 に答える