2010-05-29 4 views
0

Comment puis-je comparer la première lettre du premier élément d'un char **?question facile c: comparer premier caractère d'un tableau de caractères

J'ai essayé:

int main() 
{ 
    char** command = NULL; 
    while (true) 
    { 
     fgets(line, MAX_COMMAND_LEN, stdin); 
     parse_command(line, command); 
     exec_command(command); 
    } 
} 

void parse_command(char* line, char** command) 
{ 
    int n_args = 0, i = 0; 
    while (line[i] != '\n') 
    { 
     if (isspace(line[i++])) 
      n_args++; 
    } 

    for (i = 0; i < n_args+1; i++) 
     command = (char**) malloc (n_args * sizeof(char*)); 

    i = 0; 
    line = strtok(line," \n"); 
    while (line != NULL) 
    { 
     command[i++] = (char *) malloc ((strlen(line)+1) * sizeof(char)); 
     strcpy(command[i++], line); 
     line = strtok(NULL, " \n"); 
    } 
    command[i] = NULL; 
} 

void exec_command(char** command) 
{ 
    if (command[0][0] == '/') 
      // other stuff 
} 

mais qui donne une erreur de segmentation. Qu'est-ce que je fais mal?

Merci.

+0

Vouliez-vous dire pour créer foo comme une liste de chaînes? Ou juste comme une seule chaîne? '* char []' n'est pas sensé, voulez-vous dire 'char * foo []'? Pourriez-vous montrer comment foo est déclaré? – Schwern

+0

Quel est le type que vous recherchez? Vous voulez dire un tableau de chaînes ou quoi? Il n'y a pas de type comme '* char []'. – Chuck

+0

question mise à jour. – nunos

Répondre

1

Le problème est que vous allouez un tableau char * dans parse_command, mais le pointeur sur ce tableau ne sort jamais de la fonction. Donc exec_command obtient une valeur de pointeur de poubelle. La raison en est, en appelant parse_command(line, command) vous passez une copie de la valeur actuelle du pointeur command, qui est ensuite écrasée dans la fonction - mais la valeur d'origine n'est pas affectée par cela!

Pour cela, soit vous devez passer un pointeur vers le pointeur que vous souhaitez mettre à jour, ou vous devez retourner le pointeur sur le tableau alloué de parse_command. En dehors de char*** regardant laid (au moins pour moi), cette dernière approche est plus simple et plus facile à lire:

int main() 
{ 
    char** command = NULL; 
    while (true) 
    { 
     fgets(line, MAX_COMMAND_LEN, stdin); 
     command = parse_command(line); 
     exec_command(command); 
    } 
} 

char** parse_command(char* line) 
{ 
    char** command = NULL; 
    int n_args = 0, i = 0; 
    while (line[i] != '\n') 
    { 
     if (isspace(line[i++])) 
      n_args++; 
    } 

    command = (char**) malloc ((n_args + 1) * sizeof(char*)); 

    i = 0; 
    line = strtok(line," \n"); 
    while (line != NULL) 
    { 
     command[i] = (char *) malloc ((strlen(line)+1) * sizeof(char)); 
     strcpy(command[i++], line); 
     line = strtok(NULL, " \n"); 
    } 
    command[i] = NULL; 
    return command; 
} 

Notes:

  • dans votre original parse_command, vous allouer de la mémoire à command dans une boucle , ce qui est inutile et crée juste des fuites de mémoire. Il suffit d'allouer de la mémoire une fois. Je suppose que vous voulez command pour contenir des pointeurs n_args + 1, donc j'ai modifié le code en conséquence.
  • Dans la dernière while boucle de parse_command, vous incrémentez deux fois incorrectement i, ce qui entraîne également un comportement indéfini, c'est-à-dire un défaut de segmentation possible. Je l'ai réparé ici.
+0

pourriez-vous s'il vous plaît fournir le code pour cela? Merci. – nunos

+0

@nunos, voir ma mise à jour. –

2

Pouvez-vous coller plus de code? Avez-vous alloué de la mémoire pour votre tableau char * et pour les éléments de votre tableau char *?

Questions connexes