首页 > 解决方案 > 请解释这个C代码有什么问题?

问题描述

我正在尝试获取目录中存在的所有文件,然后向该文件添加 .enc 扩展名。示例-让 File.txt 存在,然后我将执行一些与加密相关的任务,之后新文件名将是 File.txt.enc

这是我的代码:

#include <dirent.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    DIR *d;
    struct dirent *dir;
    char *name;
    int val;
    d = opendir(".");
    if (d)
    {
        while ((dir = readdir(d)) != NULL)
        {
            name=dir->d_name;
            printf("File Found:%s\n",name);
            strcat(name,".enc");
            val=rename(dir->d_name,name);
            if(val==0)
                    printf("Encrypted File:%s\n",name);
            else
                    perror("Error: ");
        }
        closedir(d);
    }
    return(0);
}

但我得到这样的输出......

File Found:write_pgm_img.c
Error: : No such file or directory
File Found:realloc.c
Error: : No such file or directory
File Found:getusage.txt
Error: : No such file or directory
File Found:directory.c
Error: : No such file or directory

正如您所看到的“没有这样的文件或目录”错误。但我不明白为什么?请解释一下。在此先感谢。

标签: cgcc

解决方案


您正在弄乱指针和内存内容:

            name=dir->d_name;
            printf("File Found:%s\n",name);
            strcat(name,".enc");
            val=rename(dir->d_name,name);

在第一行之后,name指向dir->d_name同一个内存地址。这意味着您尝试将后缀添加到所在的内存中dir->d_name。您不能期望该内存足够大以容纳您的后缀。(但在这种情况下,这不会导致问题,因为您的文件名似乎足够短)

此外,您的更新将以相同的方式影响这两者namedir->d_name这使得重命名毫无意义,因为您尝试重命名getusage.txt.encgetusage.txt.enc

一个可能的解决方案可能是:

        char name[sizeof(dir->d_name)+4];
        while ((dir = readdir(d)) != NULL)
        {
            strcpy(name, dir->d_name);
            printf("File Found:%s\n",name);
            strcat(name,".enc");
            val=rename(dir->d_name,name);

推荐阅读