2012-12-07 5 views
0

을 변화시키고이 루트는 괜찮 어디에서 지금까지 가지고있는 코드가 발견 한,하지만 내가 줄을 추가 할 때 :내 문자 배열

printf("  name: %s\n", readdir(opendir(cur_spot))->d_name); 

를이 cur_spot을 변경하고 이상한 문자를 추가합니다 그것을 (파일 이름 :. ~?) 그것이 무엇을 인쇄합니다 .. 어떤 일이 일어나는 이유는 무엇입니까?

#include <time.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <dirent.h> 
#include <sys/stat.h> 
#include <sys/types.h> 

int main(int argc, char *argv[]) { 
    struct stat file_stats; 
    struct stat parent_stats; 
    struct dirent temp_dir; 

    char cwd_name[256]; //directory name 
    char cur_spot[256]; //current directory spot 

    cur_spot[0] = '.'; 
    stat(cur_spot, &file_stats); 
    printf("filename: %s\n", cur_spot); 
    printf(" inode: %ld\n", file_stats.st_ino); 


    strcat(cur_spot, "."); 
    stat(cur_spot, &parent_stats); 
    printf("filename: %s\n", cur_spot); 
    printf(" inode: %ld\n", parent_stats.st_ino); 

    while(file_stats.st_ino != parent_stats.st_ino) { 
     printf("not at root yet\n\n"); 

     stat(cur_spot, &file_stats); 
     printf(" current child\n"); 
     printf("  inode: %ld\n", file_stats.st_ino); 
     printf("  name: %s\n", readdir(opendir(cur_spot))->d_name); 
     strcat(cur_spot, "/.."); 
     stat(cur_spot, &parent_stats); 
     printf(" current parent\n"); 
     printf("  inode: %ld\n", parent_stats.st_ino); 
    } 
     printf("at root\n"); 


    return 0; 
} 
+0

당신은'문자의 cur_spot [256]를 초기화하지 않습니다

어쨌든, 나는 당신이 원하는 무슨 생각을 할 내 첫 번째 대답에서 코드를 modded하게 , & file_stats);'누가 stat인지 알 수 있습니다. –

+0

좀 더 정확히 말하면'cur_spot [1] = 0;'이 없습니다. –

+0

또는'char cur_spot [256] = ".";로 초기화하십시오. – Barmar

답변

1

이 GCC에 나를 위해 잘 작동 :

#include <time.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <dirent.h> 
#include <sys/stat.h> 
#include <sys/types.h> 

int main(int argc, char *argv[]) { 
    struct stat file_stats; 
    struct stat parent_stats; 
    struct dirent temp_dir; 
    DIR *dirp; 

    char cwd_name[256]; //directory name 
    char cur_spot[256]; //current directory spot 

    strcpy(cur_spot,"."); // <------------ changed 
    stat(cur_spot, &file_stats); 
    printf("filename: %s\n", cur_spot); 
    printf(" inode: %ld\n", file_stats.st_ino); 


    strcat(cur_spot, "."); 
    stat(cur_spot, &parent_stats); 
    printf("filename: %s\n", cur_spot); 
    printf(" inode: %ld\n", parent_stats.st_ino); 

    while(file_stats.st_ino != parent_stats.st_ino) { 
     printf("not at root yet\n\n"); 

     stat(cur_spot, &file_stats); 
     printf(" current child\n"); 
     printf("  inode: %ld\n", file_stats.st_ino); 
     dirp=opendir(cur_spot); // <----------------added 
     printf("  name: %s\n", readdir(dirp)->d_name); // <----changed 
     closedir(dirp); // <------------------------added 
     strcat(cur_spot, "/.."); 
     stat(cur_spot, &parent_stats); 
     printf(" current parent\n"); 
     printf("  inode: %ld\n", parent_stats.st_ino); 
    } 
     printf("at root\n"); 


    return 0; 
} 
+0

이 글은 나에게도 효과적이다. 그러나 나는 d_name이 디렉토리의 이름을 반환 하겠지만 인상적이었다. .bash_logout 또는 srv (srv는 루트가있는 곳)입니다. ls 나 그와 같은 것을 사용할 때 볼 수있는 것을 인쇄 할 수있는 방법이 있습니까? –

+0

@TroyCosentino - 오래되었습니다. 지금은 더 살펴볼 시간이 없지만 readdir()을 계속 호출하면 각 호출시 디렉토리의 다음 파일이 계속 제공됩니다. . 디렉토리 종료 조건이 무엇인지 기억이 안납니다. 'man' 명령어를 사용할 수 있습니까? – phonetagger

+0

@TroyCosentino - 내가 생각하는 바를 수행하는 추가 변경 사항에 대한 새로운 답변을 확인하십시오. – phonetagger

0

당신은 문자 배열의 끝에 NULL 문자를 추가해야합니다.

는 잘못된 :

cur_spot[0] = '.'; 

오른쪽 :

cur_spot[0] = '.'; 
cur_spot[1] = '\0'; 

널 (NULL) 문자는 문자열을 종료합니다. 문자열은 기본적으로 NULL로 초기화되거나 초기화되지 않을 수 있습니다.

0

당신은 루프에서 "opendir"을 잔뜩하지만 "closedir"의 흔적은 보이지 않습니다. 너는 벌을 받아야한다 ...

0

이것은 초기 질문의 범위를 넘어서는 것이므로, 나는 첫 번째 질문과는 별도로 답변을 추가하고있다. 내 첫 번째 대답 아래 내 의견에 말했듯이, 당신이 디렉토리 내의 모든 파일의 파일 이름을 출력하려고한다면, 맨 페이지를 읽는 것에서부터 NULL 반환 만하는 종료 조건까지 readdir()을 계속 호출한다. 값. 당신의 man 페이지가 READDIR(2) 또는 This is not the function you are interested in이라면, 정말로하고 싶은 것은 readdir의 3 man 페이지를 참조하십시오.이 페이지는 man -s 3 readdir으로 얻을 수 있습니다. `최초`스탯 (cur_spot 그래서,

#include <time.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <dirent.h> 
#include <sys/stat.h> 
#include <sys/types.h> 

int main(int argc, char *argv[]) { 
    struct stat file_stats; 
    struct stat parent_stats; 
    struct dirent temp_dir; 
    DIR *dirp; 
    struct dirent* dent; 

    char cwd_name[256]; //directory name 
    char cur_spot[256]; //current directory spot 

    strcpy(cur_spot,".");   // <------------- changed 
    stat(cur_spot, &file_stats); 
    printf("filename: %s\n", cur_spot); 
    printf(" inode: %ld\n", file_stats.st_ino); 


    strcat(cur_spot, "."); 
    stat(cur_spot, &parent_stats); 
    printf("filename: %s\n", cur_spot); 
    printf(" inode: %ld\n", parent_stats.st_ino); 

    while(file_stats.st_ino != parent_stats.st_ino) { 
     printf("not at root yet\n\n"); 

     stat(cur_spot, &file_stats); 
     printf(" current child\n"); 
     printf("  inode: %ld\n", file_stats.st_ino); 
     dirp=opendir(cur_spot); // <------------- added 
     do {      // <------------- NEW 
      dent = readdir(dirp); // <------------- NEW 
      if (dent)    // <------------- NEW 
       printf("  name: %s\n", dent->d_name); 
     } while (dent);   // <------------- NEW 
     closedir(dirp);   // <------------- added 
     strcat(cur_spot, "/.."); 
     stat(cur_spot, &parent_stats); 
     printf(" current parent\n"); 
     printf("  inode: %ld\n", parent_stats.st_ino); 
    } 
     printf("at root\n"); 


    return 0; 
}