是否有正确的方法将基本路径名称与新路径名连接?

时间:2017-12-08 15:48:41

标签: c

有没有办法可以用更新的路径更新基本路径的char数组?

struct dirent *dp;
DIR *dir;
struct stat buf;
dir = opendir("./statdir/");
int x;
char base_path[11] = "./statdir/";
char* full_path;

int main(int argc, char* argv[]){
  while((dp = readdir(dir)) != NULL) {
     full_path = strcat(base_path, dp->d_name);

     if((x = lstat(full_path, &buf)) == -1) {
         perror("stat failed");
         exit(1);
       }
       printf("Debug: %s\n", full_path);

     }
     closedir(dir);
     return(0);
  }
}

我的目标是在每次循环后更新full_path到base_path +无论参数传递给argv [],在我的目录中我有两个文件名为file1和file2 ....

即如果我运行我的代码并写了./Stat,我希望full_path为“./statdir/file1”,然后是“./statdir/file2”

我得到的结果是:

调试:./ statdir /.

调试:./ statdir /...

stat failed:没有这样的文件或目录

2 个答案:

答案 0 :(得分:1)

您可以使用snprintf像这样构建完整的文件名...

snprintf(full_path, PATH_MAX, "%s/%s",base_path, dp->d_name);

...但您首先需要确保full_path有空间来包含文件名,所以替换

char *full_path;

char full_path[PATH_MAX];

答案 1 :(得分:0)

您将字符串连接到base_path,但该数组的长度足以支持您初始化的字符串。这意味着你要在数组末尾写字。这会调用undefined behavior

另请注意,full_path指向base_path的开头。

相反,将full_path数组设为足以容纳完整路径的数组。然后使用strcpy复制基本路径,然后使用strcat添加当前条目。

char full_path[100];
...

  while((dp = readdir(dir)) != NULL) {
    strcpy(full_path, base_path);
    strcat(full_path, dp->d_name);