请解释这个 C 代码有什么问题?

Rup*_*098 0 c gcc

我想要的是获取目录中存在的所有文件,然后向该文件添加 .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);
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的“没有这样的文件或目录”错误。但我不明白为什么?请解释。提前致谢。

Ger*_*rdh 5

你搞乱了指针和内存内容:

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

第一行后,namedir->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);
Run Code Online (Sandbox Code Playgroud)