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

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 65
    Points : 35
    Points
    35
    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
    26 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 881
    Points : 219 326
    Points
    219 326
    Billets dans le blog
    123
    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.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 65
    Points : 35
    Points
    35
    Par défaut
    re M.littlewhite :
    merci pour vos remarque .
    j'ai revu mon code encore une fois,j'ai modifié petite chose mais c'est
    toujours le même probleme <erreur de segmentation>.

    voici encore le code :je pense que probleme réside au niveau du premier
    appel de la fonction strcat (d'ailleur c'est signalé au niveau du code),espérant
    que vas le voir encore une fois .
    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
     
    #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=NULL;
    char *tampon=NULL;
    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("%[^\n]",comand);
    char *comdup=strdup(comand);
    c = strtok_r(comdup,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,a=0;
    char chaine[20]="";
    char **lien[40];
    while (j != i)
    {
    while ((s != k)&&(acces == 1))
    { printf("%d,%d,%d,%d\n",i,j,s,k);
    strcat(chaine,*tlien[j]);//@@@@@@@@@@@@@@@@@@@@@@@@@@@@ le
    pblme est là
    strcat(chaine,"/");
    printf("%s\n",chaine); //****************** juste pour le test
    char *p;
    char *buf;
    char *dup;
    dup = strdup(*tab[s]);
    if (dup==NULL) dup = *tab[s];
    p = strtok_r(dup," ",&buf);
    strcat(chaine,p);
    printf("%s\n",chaine); //********************** juste pour le test
    if (access(chaine,F_OK)==0)
    {
    acces= 0;
    *lien[a]=chaine; //la commande existe ************************** lien[a]=&chaine
    a++;
    }
    strcpy(chaine,"");
    }
    if (acces == 0) { j++; s=0;acces = 1;}
    else {printf("commande inexistante \n");break;}
    }
    return 0;
    }
    et merci

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 881
    Points : 219 326
    Points
    219 326
    Billets dans le blog
    123
    Par défaut
    Bonjour,

    Il manque un tas de free, je pense.
    Du moins, un pour comdup.

    J'ai beaucoup de mal à comprendre ce que fais ton programme, mais en débugguant ( merci gdb/ddd ) je commence à y voir plus clair.
    Tu as de la chance de ne pas être dans un cas, ou le PATH ne contient pas plus de 10 chemin ( car sinon, tu aurait un problème avec 'tlien' que tu limite à 10 )

    Pour debugger l'erreur sur le strcat, j'ai déclaré tlien comme ceci :
    par contre, pour le remplir, la boucle while devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while (p != NULL)
    { 
    	tlien[k]=p;
    	/*printf("%s\n",*tlien[k]);*/
    	k++;
    	p = strtok_r(NULL,":",&tampon);
    }
    et le strcat devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strcat(chaine,tlien[j]);
    Je t'avais bien dit, hier, qu'il y avait certainement un pointeur en trop :p

    L'erreur est reproduite pour 'lien' et 'tab'
    ( Les noms de tes variables ne sont pas très clairs, il faudrait arranger ça )

    Maintenant j'arrive à un point, ou le programme tourne en rond ( à l'infinie dans la boucle une boucle while )
    J'avais inséré 'lol' ...

    Dans la boucle qui commance par ces conditions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while ((s != k)&&(acces == 1))
    tu ne modifie jamais s ni k, donc ça boucle à l'infinie.
    Juste pour voir, j'ai rajouté à la fin, s++.
    Bien sur ça a planté, car je n'insère qu'une seule commande 'lol' et donc après le strdup plante, car il n'y a rien dans 'tab'

    D'ailleurs, un meilleur code serai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (tab[s]!=NULL)
    	dup = strdup(tab[s]);
    else
    	break; // Quitte le while
    Voilà, pour la première fois, le programme à fini son exécution \o/
    Voici le code que j'ai, relativement débuggé.
    ( Je dis pas que ça marche à tous les coups, c'est à toi de voir, mais ça marche au moins, quand on rentre qu'une commande, 'lol' est rien d'autre.
    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
     
    #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=NULL;
    	char *tampon=NULL;
     
    	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("%[^\n]",comand);
     
    	char *comdup=strdup(comand);
     
    	c = strtok_r(comdup,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,a=0;
    	char chaine[20]="";
    	char *lien[40];
     
    	while (j != i)
    	{
    		while ((s != k)&&(acces == 1))
    		{
    			printf("%d,%d,%d,%d\n",i,j,s,k);
    			strcat(chaine,tlien[j]);
    			strcat(chaine,"/");
    			printf("%s\n",chaine); //****************** juste pour le test
     
    			char *p;
    			char *buf;
    			char *dup;
     
    			if (tab[s]!=NULL)
    				dup = strdup(tab[s]);
    			else
    				break;
     
    			p = strtok_r(dup," ",&buf);
    			strcat(chaine,p);
    			printf("%s\n",chaine); //********************** juste pour le test
     
    			if (access(chaine,F_OK)==0)
    			{
    				acces= 0;
    				lien[a]=chaine; //la commande existe ************************** lien[a]=&chaine
    				a++;
    			}
     
    			strcpy(chaine,"");
    			s++;
    		}
    		if (acces == 0)
    		{
    			j++;
    			s=0;
    			acces = 1;
    		}
    		else 
    		{
    			printf("commande inexistante \n");
    			break;
    		}
    	}
    	return 0;
    }
    Si tu as d'autres problèmes, ou des points qui ne sont pas clairs, n'hésitent pas à demander
    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.

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    pour le PO :

    merci de ne pas poster en double (cross-poster). Ce message est déjà sur le forum C, avec déjà un certain nombre de réponses..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 881
    Points : 219 326
    Points
    219 326
    Billets dans le blog
    123
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    pour le PO :

    merci de ne pas poster en double (cross-poster). Ce message est déjà sur le forum C, avec déjà un certain nombre de réponses..
    Mince, ça veut dire que je l'avais loupé sur le forum C ... :s
    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