C 目录修改的分段错误?

C 目录修改的分段错误?,c,segmentation-fault,C,Segmentation Fault,这是我的密码: /* * main.c * * Created on: 15 Oct 2010 * Author: mohit */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/dir.h> #include <sys/unistd.h> void print_usage(); int main(int ar

这是我的密码:

/*
 * main.c
 *
 *  Created on: 15 Oct 2010
 *      Author: mohit
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/dir.h>
#include <sys/unistd.h>

void print_usage();

int main(int argc, char *argv[])
{
    int i;
    char *directory;
    char *name;

    //Iterate through command line arguments
    for (i = 1; i < argc; i++)
    {
    if (!strcmp(argv[i], "-d") || !strcmp(argv[i], "--directory"))
    {
        memcpy(directory, argv[i + 1], sizeof (argv[i + 1]));
        continue;
    }

    else if (!strcmp(argv[i], "-n") || !strcmp(argv[i], "--name"))
    {
        memcpy(name, argv[i + 1], sizeof (argv[i + 1]));
        continue;
    }
}

if (!name)
{
    perror("\n\nIncorrect Usage! Name was not provided!\n\n");
    print_usage();
}
if (directory)
    chdir(directory);

printf("\nCreating %s.theme directory...\n", name);
mkdir(strcat(name, ".theme"), "a+rw");
printf("Created %s.theme...\n", name);

printf("Entering %s.theme...\n", name);
chdir(strcat(name, ".theme"));

printf("Creating Icons directory...\n");
mkdir("Icons", "a+rw");
printf("Created Icons...\n");

printf("Creating Bundles directory...\n");
mkdir("Bundles", "a+rw");
printf("Created Bundles...\n");

printf("Creating UIImages directory...\n");
mkdir("UIImages", "a+rw");
printf("Created UIImages...\n");

printf("Creating Folder directory...\n");
mkdir("Folder", "a+rw");
printf("Created Folder...\n");

return 0;
}

void print_usage()
{
printf("\n\nUsage: wbt-create [--directory directory] --name theme_name\n");
printf("\n\n\t wbt-create [-d directory] -n theme_name\n");
}
/*
*main.c
*
*创建日期:2010年10月15日
*作者:莫希特
*/
#包括
#包括
#包括
#包括
#包括
无效打印_用法();
int main(int argc,char*argv[])
{
int i;
char*目录;
字符*名称;
//遍历命令行参数
对于(i=1;i
这些是声明指针,但没有为它们分配任何内存。当您使用memcpy()将数据复制到这些指针时,将出现Seg错误

您可以在堆栈上声明字符数组,例如:

char directory[100];
或者您必须使用malloc()自己分配内存

这些是声明指针,但没有为它们分配任何内存。当您使用memcpy()将数据复制到这些指针时,将出现Seg错误

您可以在堆栈上声明字符数组,例如:

char directory[100];
或者您必须使用malloc()自行分配内存。

更改:

int main(int argc, char *argv[])
{
    int i;
    char *directory;
    char *name;

    //Iterate through command line arguments
    for (i = 1; i < argc; i++)
    {
        if (!strcmp(argv[i], "-d") || !strcmp(argv[i], "--directory"))
        {
            memcpy(directory, argv[i + 1], sizeof (argv[i + 1]));
            continue;
        }

        else if (!strcmp(argv[i], "-n") || !strcmp(argv[i], "--name"))
        {
            memcpy(name, argv[i + 1], sizeof (argv[i + 1]));
            continue;
        }
    }
    ...
intmain(intargc,char*argv[])
{
int i;
char*目录;
字符*名称;
//遍历命令行参数
对于(i=1;i
致:

#包括
int main(int argc,char*argv[])
{
int i;
char目录[PATH_MAX];
字符名[PATH_MAX];
//遍历命令行参数
对于(i=1;i
更改:

int main(int argc, char *argv[])
{
    int i;
    char *directory;
    char *name;

    //Iterate through command line arguments
    for (i = 1; i < argc; i++)
    {
        if (!strcmp(argv[i], "-d") || !strcmp(argv[i], "--directory"))
        {
            memcpy(directory, argv[i + 1], sizeof (argv[i + 1]));
            continue;
        }

        else if (!strcmp(argv[i], "-n") || !strcmp(argv[i], "--name"))
        {
            memcpy(name, argv[i + 1], sizeof (argv[i + 1]));
            continue;
        }
    }
    ...
intmain(intargc,char*argv[])
{
int i;
char*目录;
字符*名称;
//遍历命令行参数
对于(i=1;i
致:

#包括
int main(int argc,char*argv[])
{
int i;
char目录[PATH_MAX];
字符名[PATH_MAX];
//遍历命令行参数
对于(i=1;i
程序运行时,
argv
中的参数将保持分配状态。因此,您可以避免
memcpy
(和内存分配),只需分配指针即可。示例如下:

...
int main(int argc, char *argv[])
{
    int i;
    char *directory;
    char *name;

    //Iterate through command line arguments
    for (i = 1; i < argc; i++)
    {
    if (!strcmp(argv[i], "-d") || !strcmp(argv[i], "--directory"))
    {
        directory = argv[i + 1];
        continue;
    }

    else if (!strcmp(argv[i], "-n") || !strcmp(argv[i], "--name"))
    {
        name = argv[i + 1];
        continue;
    }
}
...
。。。
int main(int argc,char*argv[])
{
int i;
char*目录;
字符*名称;
//遍历命令行参数
对于(i=1;i

但是,我强烈建议使用。这是一个相当标准的库,可以很好地处理这类事情。
argv
中的参数将在程序运行时保持分配状态。因此,您可以避免
memcpy
(和内存分配),只需分配指针即可。示例如下:

...
int main(int argc, char *argv[])
{
    int i;
    char *directory;
    char *name;

    //Iterate through command line arguments
    for (i = 1; i < argc; i++)
    {
    if (!strcmp(argv[i], "-d") || !strcmp(argv[i], "--directory"))
    {
        directory = argv[i + 1];
        continue;
    }

    else if (!strcmp(argv[i], "-n") || !strcmp(argv[i], "--name"))
    {
        name = argv[i + 1];
        continue;
    }
}
...
。。。
int main(int argc,char*argv[])
{
int i;
char*目录;
字符*名称;
//遍历命令行参数
对于(i=1;i
但是,我强烈推荐使用。这是一个相当标准的库,可以处理这类事情