Bonjour à tous,

Dans le cadre de mes études, je dois faire un programme qui reproduit les comportements de base d'un shell bach. J'ai quasiment terminé, mais je bloque sur un point : implémenter l'équivalent de argv[] après avoir récupérer une saisie de l'utilisateur.

Je poste ici seulement les bouts de code concerné, le main et la fonction qui pose problème. C'est sûrement un problème trivial sur des pointeurs (ma mémoire semble ne pasêtre alloué) mais comme j'utilise la référence à un pointeur sur un pointeur, je m'embrouille. Peut-être me suis je compliquer la vie pour rien...

main.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
int main(int argc, char *argv[], char *arge[]) {
 
	char *commande = NULL;
	char **arguments = NULL;
 
	printf("Type Q to quit the shell\n>>");
 
	lireCommande(&commande, &arguments);
	printf("Valeur de commande dans le main : %s\n", commande);
 
	for(int i=0; arguments[i]!=NULL; i++){
		printf("Valeur de argument[%d] dans le main : %s\n", i, arguments[i]);
	}
 
	while(strcmp("Q", commande) != 0){
		printf("Valeur de strcmp : %d\n", strcmp("Q", commande));
	/*
		if(strcmp("setenv", commande) == 0){
			setenv2(commande, arguments, arge);
		}
		// Traitement des commandes externes
		else if(typeCommande(commande) == 0){
			commandeExterne(commande, arguments);
		}		
		// Traitement des commandes internes
		else {
			commandeInterne(commande, arguments);
		}
	*/	
		printf(">>");
		lireCommande(&commande, &arguments);
	}
 
 
	free(commande);
	free(arguments);
	return 0;
}
et ma fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
void lireCommande(char **commande, char **arguments[]){
	char buffer[256];
	char *abuffer[10];
	char* delim = " ";
	int i = 0;
	char *token;
 
	if(fgets(buffer, sizeof buffer, stdin)==NULL){
		printf("Erreur de lecture\n");
		exit(-1);
	}
	else{
		buffer[strcspn(buffer, "\n")] = '\0';    // Remplace le \n à la fin du fgets par \0
 
		*commande = calloc(strlen(buffer)+1, sizeof(char));
		strcpy(*commande, buffer);
 
		token = strtok(buffer, delim);
		printf("Valeur de token : %s\n", token);
 
		while(token!=NULL){
			abuffer[i]=token;
			token = strtok(NULL, delim);
			i++;	
		}
		printf("Valeur de i : %d\n", i);
 
		*arguments = calloc(i, sizeof(char*));//marche pas, pourquoi ?
 
		for(int j=0; j<i; j++){
			printf("Valeur de abuffer[%d] dans lireCommande : %s\n", j, abuffer[j]);
			*arguments[j]=abuffer[j]; //segfault pour j>0
			printf("Valeur de arguments[%d] dans lireCommande : %s\n", j, *arguments[j]);
		}
 
		printf("Valeur de commande dans lireCommande : %s\n", *commande);
	}
}
Le problème survient lorsque je passe arguments par référence dans ma fonction lireCommande, sinon ça fonctionne correctement (mais je ne peux donc pas l'utiliser dans le main).

J'ai essayé de débuger avec valgrind mais je n'ai pas compris grand chose d'autre que ''ma mémoire est pas allouée".

Je vous remercie grandement par avance.