2010-10-15 72 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; 
     } 
    } 
    ...