操作字符串时出现分段错误?

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," ");