2010-10-15 19 views
0

这里是我的代码:目录修改的分段错误?

/* 
* 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"); 
} 

回答

2

论点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; 
    } 
} 
... 

但是,我强烈建议使用getopt。这是一个相当标准的库,很好地处理这些事情。

1
char *directory; 
char *name; 

那些正在申报三分球,但他们没有分配任何内存。当你做memcpy()把数据复制到这些指针时,你会得到Seg错误。

你可以在栈上声明字符数组来代替,一样的东西:

char directory[100]; 

,或者你将不得不使用malloc()给自己分配的内存。

+0

为什么分配不必要的内存? 'argv'不会去任何地方。 – 2010-10-15 16:58:06

+0

@Michael对于这个确切的情况,肯定会起作用。但总的来说,人们应该明白为什么会出现段错误,这就是我想指出的。 – 2010-10-15 17:16:15

1

变化:

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; 
     } 
    } 
    ... 

到:你的程序运行时

#include <limits.h> 

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

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

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