这段代码的和平总结了我所遇到的问题。我想将文件从源文件复制到指定的目的地,我可以将其更改为“' s”的功能' 39; s集成在一个应用程序中我试图创建管理文件
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void concatenate_string(char *original, char *add)
{
while(*original!='\0')
original++;
while(*add!='\0')
{
*original = *add;
add++;
original++;
}
*original = '\0';
}
int main(int argc,char *argv[])
{
char *nom;
char *path;
printf("entrer a name \n");
scanf("%s",nom);
printf("entrer a pathh \n");
scanf("%s",pathh);
char *dest=(char*)malloc(strlen(nomm)+46+1);
strcat(dest,"/home/ridaamine/Desktop/app/application/Files/");
strcat(dest,nom);
char *comand=(char*)malloc(strlen(name)+8+strlen(path)+1);
strcat(comand,"cp -via ");
strcat(comand,path);
strcat(comand," ");
strcat(comand,name);
system(comand);
}
答案 0 :(得分:1)
您没有初始化nom
scanf("%s",nom);
或者
nom = malloc(SOME_SIZE);
然后,让我们说SOME_SIZE == 100
scanf("%99s", nom);
或
char nom[SOME_SIZE];
然后,让我们说SOME_SIZE == 100
scanf("%99s", nom);
当然同样适用于path
。
第二种解决方案更好,因为它更快not that much
,使用后你不需要free(nom)
。在极少数情况下可能需要第二种情况,即字符串的大小如此之大(> 8M),它会溢出堆栈。
由于 Weather Vane
指出strcat
也存在问题,您应该第一次使用strcpy
strcat(dest,"/home/ridaamine/Desktop/app/application/Files/");
strcat(dest,nom);
应该
strcpy(dest,"/home/ridaamine/Desktop/app/application/Files/");
strcat(dest,nom);
并且很明显,这次同样适用于command
。
最后,你有一个你没有计入的空间
malloc(strlen(dest) + 8 + strlen(path) + 1 + 1 /* space " " */)
提示:您不需要投射malloc
,这样就不会隐藏潜在的错误。在取消引用指针之前,请务必检查malloc
是否没有返回NULL
。
你完成后也应该免费打电话,这是你自己的代码修复
int main(int argc,char *argv[])
{
char nom[100];
char path[100];
char _path[] = "/home/ridaamine/Desktop/app/application/Files/";
char cp[] = "cp -via ";
char space[] = " ";
printf("entrer a name \n");
scanf("%99s", nom);
printf("entrer a path \n");
scanf("%99s", path);
char *dest = malloc(strlen(nom) + strlen(_path) + 1);
if (dest == NULL)
{
printf("no more memory left.\n");
return -1;
}
strcpy(dest, _path);
strcat(dest, nom);
char *comand = malloc(strlen(dest) + strlen(cp) + strlen(space) + strlen(path) + 1);
if (command == NULL)
{
free(dest);
printf("no more memory left.\n");
return -1;
}
strcpy(comand, cp);
strcat(comand, path);
strcat(comand, space);
strcat(comand, dest);
free(dest);
system(comand);
free(command);
return 0; // always return from main
}
答案 1 :(得分:1)
第一个strcat()
必须在每种情况下都更改为strcpy()
,因为字符串尚未初始化为空字符串。第一个字符串dest
肯定会太短。
char *dest=(char*)malloc(strlen(nomm)+46+1); // this is too short
strcpy(dest,"/home/ridaamine/Desktop/app/application/Files/");
strcat(dest,nom);
char *comand=(char*)malloc(strlen(name)+8+strlen(path)+1);
strcpy(comand,"cp -via ");
strcat(comand,path);
strcat(comand," ");