IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Exécuter des commandes shell


Sujet :

C

  1. #21
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 17
    Points : 3
    Points
    3
    Par défaut
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdlib.h>
     
    typedef struct command
    {
    	char chemin[256];
    	char instruction[128];
    	char argument[128];
     
    }command;
     
    void 
    Execution(command cmde, int path)
    {
    	pid_t		fils;
    	printf("\nentrée fonction Execution :\n\n\n");
    	printf("cmde.instruction : %s\n\n", cmde.instruction);
    	printf("cmde.chemin : %s\n\n", cmde.chemin);
    	printf("cmde.argument : %s\n\n", cmde.argument);
     
    	fils=fork();
    	if (fils == 0)
    	{
    		if (path > 0)
    		{
    			printf("execl\n");
    			execl(cmde.chemin, cmde.instruction, cmde.argument, NULL);
    		}
    		else
    		{
    			printf("execlp\n\n\n");
    			execlp(cmde.instruction, cmde.instruction,cmde.argument, NULL);
    		}
    	}
    }
     
    void Interpretation(char* saisie)
    {
        int path=0, args=0,instruct=0;
        command cmde;
        cmde.argument[0]='\0';
        char* temp=strtok(saisie, " ");
        char* prog=temp;
        char* PID;
     
     
        if((PID=strchr(saisie,'&'))!=NULL)
        {
        	puts(PID);
        	printf("\n\nPid : %d\n\n",getpid());
        	*PID='\0';
        }
     
        do
        {
        	if((prog=strrchr(prog, '/')) != NULL)
    	 	{
    	 		prog++;
    	 		printf("instruction : %s\n",prog);
    	 		path=1;
    	 		instruct=1;
    	 		strcpy(cmde.chemin, temp);
    	        strcpy(cmde.instruction, prog);
    	 	}
    	 	else
    	 	{
    	 		printf("temp 5 : %s\n",temp);
    	 		if(instruct==0)
    		 	{
    		 		printf("temp 4 : %s\n",temp);
    		 		strcpy(cmde.instruction, temp);
    		    	printf("temp = %s\n", temp);
    		    	printf("cmde.instruction : %s\n\n", cmde.instruction);
    		    	instruct=1;
    		 	}
    		 	else
    		 	{
    		 		if (args > 0)
    		        {
    		        	printf("temp %d : %s\n",args+5,temp);
    		            strcat(cmde.argument, " ");
    		        }
     
    			   	strcat(cmde.argument, temp);
    			   	args++;	
    		 	}
    	 	}
     
        }
        while((temp=strtok(0, " ")) != NULL);
     
        printf("cmde.argument : %s\n\n", cmde.argument);
     
        Execution(cmde, path);
    }
     
    void Prompt(char* saisie)
    {
    	puts("1");
    	unsigned long i=strlen(saisie),j;
    	char *lapinou[6];
    	puts("2");
    	strcat(lapinou[0],"		| ̄ ̄");
    	strcat(lapinou[1],"		| ");
    	strcat(lapinou[2],"		|__");
    	strcat(lapinou[3],"		(\\__/) ||");
    	strcat(lapinou[4],"		(•ㅅ•) || ");
    	strcat(lapinou[5],"		/   づ");
    	puts("3");
    	j=i+6;
     
    	lapinou[0]=(char*) malloc(sizeof (char)*j);
    	lapinou[1]=(char*) malloc(sizeof (char)*j);
    	lapinou[2]=(char*) malloc(sizeof (char)*j);
    	puts("4");
    	while(i>0)
    	{
    		strcat(lapinou[0]," ̄");
    		strcat(lapinou[2],"_");
    		i--;
    	}
    	puts("5");
    	strcat(lapinou[0], "|");
    	strcat(lapinou[2], "|");
    	strcat(lapinou[1], "|");
     
    	for(i=0;i<6;i++)
    	{
    		puts(lapinou[i]);
    	}
    	puts("7");
    }
     
    int 
    main()
    {
    	char saisie[1500] = {'\0'};
    	char *pt;
     
    	puts("Saisir une commande :\n");
    	fgets(saisie, 300, stdin);
     
    	if ((pt=strchr(saisie, '\n')) != NULL) 
    	{
    		*pt = '\0';
    	}
    	// strncpy(cmde.chemin, saisie, sizeof(cmde.chemin));
     
    	Prompt(saisie);
     
    	return 0;
    }

  2. #22
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Citation Envoyé par M3lm4n Voir le message
    Je ne comprends pas le principe de "const string", quelle difference entre une variable et une variable... constante
    Une « chaîne constante » - navré je n'ai pas en tête de bon anglicisme pour string literal, « chaîne littérale » ou « litéral de type chaîne » n'exprimant pas grand chose - n'est ni une variable, ni une « constante de type chaîne ».

    "hello world" est plutôt l'équivalent de 42 dans int i = 42;. À l'instar de 42, elle n'est pas modifiable. En revanche contrairement à 42, il s'agit d'un objet (au sens du langage) de type char [], avec une adresse et une taille en mémoire bien définies. La suite est cohérente avec les règles du langage C : l'opérateur = ne réalise pas de copie du contenu d'un tableau, mais affecte l'adresse de son premier élément (de type char * si le tableau est de type char []).


    Citation Envoyé par M3lm4n Voir le message
    (j'ai déjà croisé ça dans le manuel sans comprendre), tout comme const char *
    Le qualificateur const appliqué à un type pointeur sert simplement à préciser au compilateur que la zone adressée ne doit pas être utilisée en écriture si le mot-clef est placé avant l'astérisque (const void * ou void const *, c'est équivalent) ou que la valeur du pointeur lui-même - l'adresse stockée - ne doit pas être modifiée si le mot-clef est placé après (void *const). Si le pointeur indique une zone en lecture seule et ne doit pas non plus changer de valeur (stocker une autre adresse, plus tard), on peut combiner les deux : const void *const.

    Par exemple, le const du second paramètre dans la signature de memcpy indique que la fonction ne touchera pas au contenu de la zone adressée, à savoir le buffer source à copier.

  3. #23
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par M3lm4n Voir le message
    Je n'avais pas compris que malloc/calloc/realloc était considérés comme des affectations.
    Il me semblait qu'il s'agissait de la (re)définition de la taille d'un tableau.
    C'est le "=" de xxx=malloc(...) qui est l'affectation. Ca affecte la valeur renvoyée par malloc (donc l'adresse de la zone réservée) à "xxx". Si ensuite tu écris xxx="toto" ben tu perds l'adresse allouée par malloc. Exactement la même situation qu'écrire int i=100; i=200.

    Citation Envoyé par M3lm4n Voir le message
    ma tête est dure, désolé. du coup un strcat() devrait faire l'affaire...
    Oui, ou bien plus simplement un strcpy().

    Citation Envoyé par M3lm4n Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	char *lapinou[6];
    	puts("2");
    	strcat(lapinou[0],"		| ̄ ̄");
    	strcat(lapinou[1],"		| ");
    	strcat(lapinou[2],"		|__");
    	strcat(lapinou[3],"		(\\__/) ||");
    	strcat(lapinou[4],"		(•ㅅ•) || ");
    	strcat(lapinou[5],"		/   づ");
    je me retrouve à nouveau avec un segmentation fault (ça fait 6 heure que je teste toutes les combinaisons possible et qui me paraîtraient logiques, mais apparement gcc n'a pas la même logique que moi
    Je pense que tu fais référence à ces lignes. Donc là tu as fait l'inverse. Tu as tenté de stocker des octets dans des pointeurs non alloués. Pas d'allocation, pas de mémoire réservée donc stockage de données dans une zone non prévue pour la recevoir.

    Je vais essayer de resimplifier ce que Matt_Houston a déjà dit
    Quand tu écris char chaine[]="Hello", le compilateur compte combien de caractères (ici 5 + 1 pour le '\0'), réserve 6 espaces pour la variable "chaine" et y stocke les éléments 'H', 'e', 'l', 'l', 'o' et '\0'. A partir de là, ce tableau de caractères est utilisable et modifiable. Tu peux, si tu veux, écrire chaine[0]='B'. Si ensuite tu affiches ton tableau au format "%s", ça affichera "Bello".
    Tu peux aussi écrire si tu veux chaine[5]='x'. Tu en as le droit. Mais en supprimant volontairement le '\0' pour le remplacer par un 'x' tu perds ce qui faisait de ce tableau une chaine. Mais tu es libre de le faire si tu sais ensuite gérer ce que ça entraine. De même si un jour tu manipules un tableau de caractères tu auras le droit, si tu veux le transformer en chaine, de rajouter manuellement un '\0' dans ce tableau (pourvu que ce soit dans l'espace affecté au tableau).
    Accessoirement tu as aussi le droit d'écrire chaine[100]='x' ou chaine[-1]='y' car le C ne possède aucun garde-fou dans ce genre de détails. Ce n'est en effet pas parce que ton tableau n'est prévu que pour 6 caractères que ça te limite dans tes actions. La philosophie des concepteurs est "le programmeur sait ce qu'il fait". Bien entendu le comportement du programme dans ce cas n'est pas garanti (on appelle ça "comportement indéterminé"). Donc c'est à toi de connaitre en permanence les limites de tes tableaux. En contrepartie, ne se dispersant pas à vérifier ce que tu fais, le C consacre toutes ses ressources à son travail "réel" et ça te donne le code le plus rapide qu'il soit possible (en dehors de l'assembleur).

    Si maintenant tu écris char *chaine="Hello", le compilateur va stocker la chaine "Hello" dans un espace statique de la mémoire ; et va juste stocker l'adresse de cet espace dans le pointeur "chaine".
    Si tu te contentes ensuite d'utiliser cette variable "chaine" d'un point de vue d'affichage pur, tu n'auras aucun souci. Tu pourras afficher "chaine" dans son ensemble, ou bien afficher juste "chaine[0]" ou "chaine[3]". De ce point de vue, il n'y aura aucune différence "visuelle" entre cette façon de déclarer "chaine" et la précédente. C'est pour ça que tu n'avais aucun souci quand tu affichais tes pointeurs.
    Là où ça bloquera, c'est si tu veux modifier son contenu (ex chaine[0]='B') car l'espace où se trouve "Hello" est statique donc non modifiable. C'est pour ça que ça caffouillait au strcat() car cette fonction va modifier le contenu du tableau qu'elle reçoit.

    Si maintenant tu écris char *chaine; strcpy(chaine, "Hello") là ça ne va plus. En effet, ici le pointeur "chaine" n'étant pas initialisé manuellement il est alors initialisé avec une adresse aléatoire. Mais cette adresse aléatoire pointe quand-même quelque part dans la mémoire. Sauf que ce "quelque part" ne t'est absolument pas réservé. Ca peut-être l'adresse d'une autre variable, ou bien même une adresse située en dehors de l'espace de ton programme (donc l'adresse utilisée par un autre programme de ton OS). Bref on retombe dans le cas chaine[-1]='y' = comportement indéterminé. C'est ce qui s'est passé avec ton code. Sauf que ça s'est passé non pas sur un pointeur mais 6 fois sur un tableau de 6 pointeurs.
    Dans ce cas, si ton pointeur est destiné à pointer vers une zone que tu ne veux pas modifier, tu peux l'affecter à cette zone via char *chaine="Hello". Si en revanche tu veux lui stocker des octets de travail (qui seront donc susceptible d'évoluer durant la vie de ton programme) mais que tu connais la taille maximale de ta zone, tu peux alors passer par le tableau classique char chaine[1000]). Si en revanche la taille n'est pas connue quand tu écris ton code (on présume alors qu'elle sera connue à un moment ou un autre quand ton programme s'excutera) tu dois alors, dès que la taille est connue, réserver de la mémoire (via malloc/calloc/realloc) et récupérer cette mémoire réservée dans le pointeur. Et ensuite ne plus jamais perdre ce pointeur pour pouvoir ensuite libérer cette mémoire quand tu n'en auras plus besoin.

    Voici ce que tu aurais dû écrire si tu veux juste des chaines statiques
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	char *lapinou[6]={
    		"		| ̄ ̄",
    		"		| ",
    		"		|__",
    		"		(\\__/) ||",
    		"		(•ㅅ•) || ",
    		"		/   づ"
    	};
    Déclaration et remplissage d'un tableau de 6 pointeurs pointant chacun vers 6 chaines statiques.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #24
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    C'est vrai que j'ai passé sous silence le piège de l'initialisation des tableaux de char via des literals..


    char s[] = "hello"; veut dire « je déclare un tableau de char aussi grand que nécessaire et j'en initialise les éléments à respectivement 'h', 'e', 'l', 'l', 'o' et '\0' ». Ici, "hello" n'est pas un objet et est équivalent à { 'h', 'e', 'l', 'l', 'o', '\0' }. On peut tout-à-fait modifier le contenu du tableau.

    char s[10] = "hello"; veut dire « je déclare un tableau de char de 10 éléments, j'en initialise les premiers à respectivement 'h', 'e', 'l', 'l', 'o' et '\0', et tous les suivants à zéro ». Ici, "hello" n'est pas un objet et est équivalent à { 'h', 'e', 'l', 'l', 'o', '\0', 0, 0, 0, 0 }. On peut tout-à-fait modifier le contenu du tableau.

    Note qu'ici chaque caractère de la chaîne correspond à un byte parce que je n'ai utilisé que des caractères de la table ASCII pour faire simple, mais ce ne serait pas le cas avec une chaîne encodée en UTF-8 comportant des caractères accentués, par exemple. C'est ce qui fait que cette écriture n'est pas uniquement un raccourci syntaxique pour « faire joli ».


    char *s = "hello"; veut dire « je déclare un pointeur de char et je l'initialise à l'adresse du premier byte d'une zone mémoire immuable occupée par la chaîne "hello" ». Ici, "hello" est un objet. On ne peut pas modifier le contenu de la zone pointée.

  5. #25
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    char s[10] = "hello"; veut dire « je déclare un tableau de char de 10 éléments, j'en initialise les premiers à respectivement 'h', 'e', 'l', 'l', 'o' et '\0', et tous les suivants à zéro »
    Tu es sûr de ce détail ? Moi j'aurais dit "et tous les suivants avec une valeur aléatoire"...

    NB (pour M3lm4n): ce détail n'a aucune importance car ce qui compte c'est le '\0' positionné en fin de chaine car toutes les fonctions qui traitent les chaines s'y arrêteront et ne s'occuperont pas de ce qu'il y a après. Et si tu veux utiliser ce qu'il y a "après" tu seras d'abord obligé d'y écrire des trucs (car ça serait illogique de vouloir traiter des données qui n'ont pas d'abord été écrites) et dans ce cas ce qu'il y a avant que tu y écrives des trucs n'a aucune importance. C'est donc plus une question de "précision des détails" qu'autre chose..
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #26
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Maintenant que tu me le demandes je n'en suis plus certain, je vais jeter un œil à la norme du coup. Il me semble qu'un tableau ne peut être partiellement initialisé et que les valeurs non précisées sont zéro.

    EDIT: c'est en 6.7.9§21 :

    If there are fewer initializers in a brace-enclosed list than there are elements or members
    of an aggregate, or fewer characters in a string literal used to initialize an array of known
    size than there are elements in the array, the remainder of the aggregate shall be
    initialized implicitly the same as objects that have static storage duration.
    « The same as objects that have static storage duration » est une expression alambiquée pour dire : zéro.

  7. #27
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    « The same as objects that have static storage duration » est une expression alambiquée pour dire : zéro.
    Oui, c'est vrai que dire "zéro" c'est évidemment trop facile et plus les phrases sont compliquée plus ça fait technique

    En fait, les données "statiques" sont initialisées à 0 donc "pareil que des données statiques" veut effectivement dire "zéro"

    Merci d'avoir vérifié
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #28
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 17
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Sve@r Voir le message

    Voici ce que tu aurais dû écrire si tu veux juste des chaines statiques
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	char *lapinou[6]={
    		"		| ̄ ̄",
    		"		| ",
    		"		|__",
    		"		(\\__/) ||",
    		"		(•ㅅ•) || ",
    		"		/   づ"
    	};
    Déclaration et remplissage d'un tableau de 6 pointeurs pointant chacun vers 6 chaines statiques.
    En fait, c'est le contraire, je voudrais ajouter des caractères à ces lignes en fonction de la saisie et toujours un problème de segmentation que ce soit avec strcat ou strcpy .

    J'en profite pour vous remercier (tous les deux) encore une fois, je n'ai pas l'habitude des forum et... whaou...

  9. #29
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par M3lm4n Voir le message
    toujours un problème de segmentation que ce soit avec strcat ou strcpy .
    strcat ou strcpy ne font que copier des caractères dans un tableau, c'est à toi de t'assurer que le tableau peut recevoir ces caractères/est assez grand pour. Ou tout simplement existe/est alloué. Et dans char *lapinou[6]; tu n'alloues rien du tout (ce que Sve@r t'as déjà fait remarquer plus haut..)
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #30
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 17
    Points : 3
    Points
    3
    Par défaut
    Désolé, j'avais laissé trainé un bout de code qu'il ne fallait pas, ça à l'air de fonctionner

  11. #31
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par M3lm4n Voir le message
    En fait, c'est le contraire, je voudrais ajouter des caractères à ces lignes en fonction de la saisie et toujours un problème de segmentation que ce soit avec strcat ou strcpy
    Reprends tout ce qui a été écrit. Tu ne peux faire du strcat/strcpy que sur une chaine "modifiable" (donc pas sur un truc style char *chaine="Hello" ou tout ce qui y ressemble). Donc soit sur un char chaine[1000] ; soit sur un char *chaine=malloc(1000 * sizeof(char)) (pardon à Matt_Houston qui va se hérisser devant ce sizeof(char)). Et dans ce dernier cas, en ne modifiant ensuite plus jamais la valeur du pointeur "chaine" (donc ne pas écrire ensuite chaine=autre_chose). Attention, ne pas modifier le pointeur n'interdit bien entendu pas de modifier ce qui est pointé !!!
    Et tu ne peux faire du strcat que sur une chaine déjà existante. Donc en plus de ce que j'ai écrit, il faut que le tableau contienne au-minimum un ' \0' pour que la fonction strcat sache où s'arrête la chaine initiale afin de pouvoir lui concaténer la suite.

    Une fois que tu sais le faire pour "un" (un tableau de char, un pointeur de char alloué manuellement) alors ensuite tu peux passer à "n" (n tableaux donc un tableau de tableaux de char ; n pointeurs donc un tableau de pointeurs de char où chaque pointeur est alloué manuellement).

    Ceci dit, tu pourrais penser ton prompt différemment. Le mettre par exemple dans une structure qui contiendrait une partie fixe (donc un pointeur vers une chaine statique c'est pas grave), et une partie modifiable (un tableau de char). Ca t'éviterait de te casser le noeud avec tes strcat/strcpy. Enfin bon là c'est juste de l'optimisation donc c'est toi qui voit.

    Citation Envoyé par M3lm4n Voir le message
    J'en profite pour vous remercier (tous les deux) encore une fois, je n'ai pas l'habitude des forum et... whaou...
    On n'est pas que deux... mais effectivement c'est un sacré forum
    Et puis on a aussi nos humoristes. Attends que Sambia arrive pour t'expliquer doctement pourquoi strcmp(x, y) == 0 est (ou n'est pas j'ai pas trop suivi) un booléen

    Citation Envoyé par M3lm4n Voir le message
    Désolé, j'avais laissé trainé un bout de code qu'il ne fallait pas, ça à l'air de fonctionner
    On va admettre que ça fonctionne. Mais méfie-toi, ce n'est pas parce qu'un programme fonctionne visuellement qu'il est exempt de bug. Quand j'ai parlé de comportement indéterminé plus haut cela signifie vraiment "comportement inconnu" qui inclue toutes les situations possibles. Qui vont d'un code "semblant" fonctionner jusqu'au reboot de ta bécane en passant par le reformatage de ton disque dur (nan j'exagère mais c'est pour illustrer). Mais ne te fie jamais à ce qu'affiche le programme pour déterminer s'il fonctionne ou pas. Comme dit M. Monk, programmer en C c'est à la fois un don, et une malédiction.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #32
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 17
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ceci dit, tu pourrais penser ton prompt différemment. Le mettre par exemple dans une structure qui contiendrait une partie fixe (donc un pointeur vers une chaine statique c'est pas grave), et une partie modifiable (un tableau de char). Ca t'éviterait de te casser le noeud avec tes strcat/strcpy. Enfin bon là c'est juste de l'optimisation donc c'est toi qui voit.
    En fait je veux faire apparaître du texte dans un rectangle dont la taille varie en fonction du contenu, d'où les strcat(var,"_") qui "rallongent" les bordures.

    Sinon, !l s'agit juste de cosmétique, j'aurais surement besoin d'infos sur les builtins, je ne vois pas trop comment appeler des fonctions qui n'existent pas.

    Je dois rendre mon boulot avant minuit (6H chez vous) ça va être une longue journée...

  13. #33
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par M3lm4n Voir le message
    En fait je veux faire apparaître du texte dans un rectangle dont la taille varie en fonction du contenu, d'où les strcat(var,"_") qui "rallongent" les bordures.
    Concentre-toi sur le fonctionnel. Les fioritures c'est à la fin.

    Citation Envoyé par M3lm4n Voir le message
    Sinon, !l s'agit juste de cosmétique, j'aurais surement besoin d'infos sur les builtins, je ne vois pas trop comment appeler des fonctions qui n'existent pas.
    Nouveau problème=nouveau topic. Ca te donnera plus de chances que d'autres intervenants viennent t'aider (ici quand ils voient que celui-là totalise 31 réponses ils ne s'embêtent pas à y entrer en pensant que tout a déjà été dit).
    Sinon moi non plus je ne vois pas trop comment appeler une fonction qui n'existe pas

    Citation Envoyé par M3lm4n Voir le message
    Je dois rendre mon boulot avant minuit (6H chez vous)
    Ah ? T'es en Guadeloupe ? Bah va à la plage et ne t'occupe pas de ce truc
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #34
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 17
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ah ? T'es en Guadeloupe ? Bah va à la plage et ne t'occupe pas de ce truc
    Si seulement...

    Citation Envoyé par Sve@r Voir le message
    Nouveau problème=nouveau topic. Ca te donnera plus de chances que d'autres intervenants viennent t'aider
    Dommage j'étais bien ici

    Enorme merci à tous !

  15. #35
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 17
    Points : 3
    Points
    3
    Par défaut




    je viens de me rendre compte d'un petit problème (surement basique...) :

    mes commandes saisies avec arguments et/ou adresse fonctionnent mais un ls tout simple me répond "no such file..."

  16. #36
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par M3lm4n Voir le message
    mes commandes saisies avec arguments et/ou adresse fonctionnent mais un ls tout simple me répond "no such file..."
    Ben printf. Mets-en de partout, regarde où ça te branche, si ensuite le execlp se fait bien etc. Même le meilleur des forums (donc bien évidemment celui-ci) ne pourra jamais débugguer ton code mieux que toi.
    Au pire tu réécris un second programme qui fait juste execlp voir si c'est là que ça merdoie.

    Sinon j'ai trouvé un truc pour les bultins: https://www.developpez.net/forums/d1...t-in-functions...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  17. #37
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 17
    Points : 3
    Points
    3
    Par défaut
    Merci Doc'

  18. #38
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    J'ai donc un gros nez rouge qui fait rire à ce point ? Sans troller effectivement tu n'as peut-être pas compris
    Citation Envoyé par Sve@r Voir le message
    ........
    On n'est pas que deux... mais effectivement c'est un sacré forum
    Et puis on a aussi nos humoristes. Attends que Sambia arrive pour t'expliquer doctement pourquoi strcmp(x, y) == 0 est (ou n'est pas j'ai pas trop suivi) un booléen
    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  19. #39
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    J'ai donc un gros nez rouge qui fait rire à ce point ?
    Terrible. Nous attendons tes interventions avec un grand intérêt

    Citation Envoyé par sambia39 Voir le message
    Citation Envoyé par Sve@r Voir le message
    Exact. Est-ce que le résultat de la fonction vaut 0 ? réponse oui ou non => c'est bien une expression booléenne.
    Ben oui - Là où tu dissertes sur 3 pages sur strcmp() et les booléens ; moi je le résume en une ligne
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  20. #40
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Et, donc suite à cette dissertation de trois pages votre "exact" vient affirmer quoi ?. Ce que j'ai écrit « que l'on a affaire à une expression booléenne et non un test de nullité » . Et si oui alors il a bien fallu expliquer des choses à travers trois pages pour comprendre que if( 0 == strcmp(x,y) ) dans une structure conditionnelle est bel et bien une expression booléen et non un test de nullité cas contraire exposez-moi vos arguments en une ligne comme vous le dites avec des exemples. @Sve@r tu n’es pas d’accord ?.
    Ceci dit, je n’ai pas compris le principe de me mentionner dans le topic (probablement d'autres topics aussi) en faisant des allusions, c’est fort amusant, mais d’un autre côté, c’est d’une légèreté d’esprits de votres part essayant d’êtres plus courtois.
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [Développement] besoin d'aide en shell
    Par kissakissa dans le forum AppleScript
    Réponses: 1
    Dernier message: 14/04/2016, 06h53
  2. Besoin d'aide commandes shell administration serveur linux
    Par SEIYA. dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 10/03/2015, 17h17
  3. Besoin d'aide : commande shell
    Par HDI103 dans le forum Shell et commandes GNU
    Réponses: 32
    Dernier message: 30/05/2013, 20h06
  4. Besoin d'aide au niveau de Shell
    Par Argael dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 01/08/2006, 11h04
  5. Besoin d'aide pour un script shell
    Par lecharcutierdelinux dans le forum Linux
    Réponses: 5
    Dernier message: 20/05/2006, 10h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo