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

Linux Discussion :

Mettre une chaine à NULL


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 65
    Par défaut Mettre une chaine à NULL
    slt tt le monde :

    SVP est ce qu'il y a quelqu'un qui peut m'aider ,d'abord comment je remet une chaine de caratére a NULL . elle est désactivée cette ligne dans le source.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //for(int r=0;r<20;r++) chaine=NULL;**********************
    et 2iément si vous pouvez me rectifier mon programme
    car j'ai essaié pas mal de fois ,pas d'erreurs de compilation,mais erreur de segmentation pendant l' exécution,je comprends pas d' ou viens ça.
    merci d'avance
    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
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <stdlib.h>
    int main ()
    {//mettre les lien de "PATH" dans le tableau tlien
    char *path = getenv("PATH");
    char *p,*tampon;
    p = strtok_r(path,":",&tampon);
    char **tlien[10];int k=0;
    while (p != NULL)
    { tlien[k]=&p;
    //printf("%s\n",*tlien[k]);
    k++;
    p = strtok_r(NULL,":",&tampon);
    } //lire la ligne de commande et mettre chaque commande dans le tableau tab;
    char comand[80],*buffer,*c,sep[]="\t;|\n";
    printf("my shell >>");
    scanf("%[^\n]",&comand);
    c = strtok_r(comand,sep,&buffer);
    char **tab[10];int i=0;
    while (c != NULL)
    {
    tab[i]=&c;
    //printf("%s\n",c);
    //printf("%s\n",*tab[i]);
    i++;
    c = strtok_r(NULL,sep,&buffer);
    }
    //vérification de l'existance des commandes tapées
    int j=0,s=0,acces=1;
    char chaine[20];
    while (j != i)
    {
    while ((s != k)&&(acces == 1))
    {
    strcat(chaine,*tlien[j]);
    strcat(chaine,"/");
    char *p,*buf,*dup;
    dup = strdup(*tab[s]);
    if (dup==NULL) dup = *tab[s];
    p = strtok_r(dup," ",&buf);
    strcat(chaine,p);
    printf("%s\n",chaine);
    if (access(chaine,F_OK)==0) acces= 0; //la commande existe
    //for(int r=0;r<20;r++) chaine=NULL;    *************************
    }
    if (acces == 0) { j++; s=0;acces = 1;}
    else {printf("commande inexistante \n");break;}
    }
    return 0;
    }

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 157
    Billets dans le blog
    152
    Par défaut
    Bonjour,

    Tu déclare chaine comme ceci:
    Ceci indique que tu défini un pointeur sur un tableau de 20 caractère
    Donc pour remettre le pointeur à NULL tu dois faire comme ceci
    Le problème c'est que cela reste faux pour le cas ou ton pointeur est un pointeur statique.
    Par contre, pour effacer ce que contient la chaine tu peux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for ( int i = 0 ; i < 20 ; i++ )
           chaine[i] = 0;
    ( D'ailleurs, je viens tilter que ton code ( de la boucle for ) fais finalement 20 fois la même chose:p.
    Contrairement au mien qui se déplace dans le tableau

    Certes ton programme compile, mais en fait, ton compilateur peut t'indiquer des messages important, sur des lignes où il doute que se soit bien se que tu veuille faire.
    Pour activer ces messages, tu peux compiler ton programme avec la ligne suivante:
    [QUOTE]gcc -Wall main.c -o main[QUOTE]
    et puis, mais tu risque de le trouver contraignant tu peux essayer:
    [QUOTE]gcc -Wall -pedantic -ansi main.c -o main[QUOTE]
    ( entre autre car il accepte que les commentaires de cette forme : '/* */' et aussi qu'il oblige que la déclaration de variable se fasse au début des fonctions et pas au milieu :p )

    Ton programme restructuré ( meilleur présentation, plus facile à lire ; pas encore corriger les bugs )
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <stdlib.h>
    int main ()
    {//mettre les lien de "PATH" dans le tableau tlien
    	char *path = getenv("PATH");
    	char *p,*tampon;
     
    	p = strtok_r(path,":",&tampon);
     
    	char **tlien[10];
    	int k=0;
     
    	while (p != NULL)
    	{ 
    		tlien[k]=&p;
    		//printf("%s\n",*tlien[k]);
    		k++;
    		p = strtok_r(NULL,":",&tampon);
    	} //lire la ligne de commande et mettre chaque commande dans le tableau tab;
     
    	char comand[80];
    	char *buffer;
    	char *c;
    	char sep[]="\t;|\n";
     
    	printf("my shell >>");
    	scanf("%s[^\n]",&comand);
     
    	c = strtok_r(comand,sep,&buffer);
    	char **tab[10];int i=0;
     
    	while (c != NULL)
    	{
    		tab[i]=&c;
    		//printf("%s\n",c);
    		//printf("%s\n",*tab[i]);
    		i++;
    		c = strtok_r(NULL,sep,&buffer);
    	}
    	//vérification de l'existance des commandes tapées
    	int j=0,s=0,acces=1;
    	char chaine[20];
    	while (j != i)
    	{
    		while ((s != k)&&(acces == 1))
    		{
    			strcat(chaine,*tlien[j]);
    			strcat(chaine,"/");
    			char *p,*buf,*dup;
    			dup = strdup(*tab[s]);
     
    			if (dup==NULL) 
    				dup = *tab[s];
     
    			p = strtok_r(dup," ",&buf);
    			strcat(chaine,p);
    			printf("%s\n",chaine);
    			if (access(chaine,F_OK)==0)
    				acces= 0; //la commande existe
    			for(int r=0;r<20;r++) chaine[r]=0;
    		}
    		if (acces == 0)
    		{ 
    			j++;
    			s=0;acces = 1;
    		}
    		else 
    		{
    			printf("commande inexistante \n");
    			break;
    		}
    	}
    	return 0;
    }
    Pour le premier scanf, il semble que tu ai mis une expression régulière ( genre doit se finir par '\n' ), scanf ne prend pas en compte se genre de chose. Si j'ai bien compris, tu veux être sur qu'il prenne bien toute les commandes ( avec les espaces ) et qu'il s'arrête finalement quand on appuie sur entrée.
    scanf ne te permettra pas de récupéré des chaines de caractère avec espaces, il s'arrêtent toujours au premier espace.
    Par contre tu devrai te pencher sur fgets pour ceci

    De plus au scanf, tu passai un pointeur de pointeur, alors qu'il n'attend qu'un pointeur simple ( un '&' en trop devant le comand ). ( Première erreur de segmentation )

    Deux grands conseils,
    Lors que tu déclare une variable , donne leurs toujours une valeur ( une variable simple à 0 , un pointeur à NULL ) sinon elle ont une valeur indeterminée ( ce qui peut être encore plus dur à voir comme bug ).
    Deuxième chose, tient toi au principe une commande par ligne ( pareil pour les déclarations, une par ligne ( c'est toujours mieux ( pour lire ) ) ).

    Cette ligne ( dans le début )
    Declare un pointeur , sur un pointeur, sur un tableau de caractère de taille 10. Je pense qu'il y en a beaucoup de trop :s

    J'arrête là pour ce soir, retouche ton code, corrige le, clarifie le. N'hésite pas à poser des questions sur ce que tu ne comprend pas ( les pointeurs j'ai l'impression ^^).

    Et, si tu as fais de gros changements, et qu'il fonctionne mieux, reposte le, je le regarderai à nouveau
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. [Debutant]Mettre une chaine de caractère dans un TEdit
    Par M E H D I dans le forum C++Builder
    Réponses: 2
    Dernier message: 02/10/2007, 14h08
  2. Adresse d'une chaine null terminated
    Par zitoune92 dans le forum Delphi
    Réponses: 3
    Dernier message: 02/04/2007, 09h18
  3. mettre une valeur nulle ds une zone deroulante
    Par gohu13 dans le forum Access
    Réponses: 2
    Dernier message: 14/10/2005, 15h38
  4. [JSP] mettre une chaine dans un format precis
    Par logica dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 09/06/2005, 10h21
  5. [Debutant] Mettre une chaine de caractere dans un tableau
    Par bouboussjunior dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 14/09/2004, 11h33

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