c - 请解释这个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
正如您所看到的“没有这样的文件或目录”错误。但我不明白为什么?请解释一下。在此先感谢。
解决方案
您正在弄乱指针和内存内容:
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
。您不能期望该内存足够大以容纳您的后缀。(但在这种情况下,这不会导致问题,因为您的文件名似乎足够短)
此外,您的更新将以相同的方式影响这两者name
,dir->d_name
这使得重命名毫无意义,因为您尝试重命名getusage.txt.enc
为getusage.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);