操作字符串时出现分段错误?
segmentation fault when manipulating strings?
这段代码总结了我 have.i 想将文件从源复制到指定目的地的问题,我可以更改它的名称它是一个集成在应用程序中的功能我'我正在尝试创建管理文件
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void concatenate_string(char *original, char *add)
{
while(*original!='[=10=]')
original++;
while(*add!='[=10=]')
{
*original = *add;
add++;
original++;
}
*original = '[=10=]';
}
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);
}
你没有初始化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
。
你终于有一个 space 你没有算进去的
malloc(strlen(dest) + 8 + strlen(path) + 1 + 1 /* space " " */)
提示:你不需要施放malloc
所以不要,它可能隐藏一个潜在的错误。在取消引用指针之前,请始终检查 malloc
没有 return 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
}
第一个 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," ");
这段代码总结了我 have.i 想将文件从源复制到指定目的地的问题,我可以更改它的名称它是一个集成在应用程序中的功能我'我正在尝试创建管理文件
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void concatenate_string(char *original, char *add)
{
while(*original!='[=10=]')
original++;
while(*add!='[=10=]')
{
*original = *add;
add++;
original++;
}
*original = '[=10=]';
}
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);
}
你没有初始化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
。
你终于有一个 space 你没有算进去的
malloc(strlen(dest) + 8 + strlen(path) + 1 + 1 /* space " " */)
提示:你不需要施放malloc
所以不要,它可能隐藏一个潜在的错误。在取消引用指针之前,请始终检查 malloc
没有 return 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
}
第一个 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," ");