2010-10-15 7 views
0

Voici mon code:Erreur de segmentation pour les modifications de répertoire?

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

Répondre

2

Arguments en argv restera alloué pendant que votre programme est en cours d'exécution. Par conséquent, vous pouvez éviter le memcpy (et l'allocation de mémoire) et attribuer simplement les pointeurs. Exemple ci-dessous:

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

Cependant, je recommande fortement l'utilisation de getopt. C'est une bibliothèque assez standard et gère assez bien ce genre de choses.

1
char *directory; 
char *name; 

Ce sont des pointeurs déclarant, mais pas allouer de la mémoire pour eux. Lorsque vous faites le memcpy() pour copier des données sur ces pointeurs, vous obtiendrez la faute Seg.

Vous pouvez déclarer des tableaux ombles sur la pile à la place, quelque chose comme:

char directory[100]; 

ou vous devrez utiliser pour allouer la mémoire vous malloc().

+0

Pourquoi allouer de la mémoire inutile? 'argv' ne va nulle part. –

+0

@Michael Pour ce cas précis, sûr que cela va fonctionner. Mais en général, on devrait comprendre pourquoi cette erreur de segmentation se produisait et c'est ce que je voulais souligner. –

1

Change:

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