操纵字符串时的分段错误?

时间:2015-01-04 19:39:12

标签: c string segmentation-fault

这段代码的和平总结了我所遇到的问题。我想将文件从源文件复制到指定的目的地,我可以将其更改为“' 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);
  }

2 个答案:

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