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 :

[fichier] Sniffer et statistiques


Sujet :

C

  1. #1
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut [fichier] Sniffer et statistiques
    Bonjour à vous développeurs,

    Je suis toute nouvelle dans le monde du C et j'avoue avoir bien du mal à m'en sortir...

    Je suis actuellement sur un projet de Mini Chat...

    Pour ce faire, j'ai à ma disposition un sniffer pour lequel j'ai fait un parseur. A ce dernier, j'aimerai rajouter un module de statistiques.

    Le problème étant que je souhaiterai le faire avec des fichiers plutôt que des tableaux. Et mes pauvres notions sur les pointeurs doivent être la cause de mon échec...

    Je me suis renseignée dessus mais j'ai du mal à saisir réellement comment ca marche

    Voici mon code actuel :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    //#include "eth_lib.h"
     
     
    statsMacDestination(char* mac){
    	FILE *pointeurFichier;
    	pointeurFichier = fopen("statMacDestination.txt", "rw");
    	//ecriture dans le fichier
     
    	//fin écriture
    	exit(0);
    }
     
     
     
     
     
     
    main(){
    	statsMacDestination("fffffffff");
    	/*******************************************
             Declaration des variables
            ********************************************/
    	int i;			//compteur
    	char ch[50];
    	char* temp;
    	int numeroTrame = 1;
    	int nb;			//nombre d'octets dans la trame
    	char* _destination;
    	char* _emission;
    	char* _type;
     
    	while(1){
    		i = 0;
    		//static struct eth_frame;
     
    		/*******************************************
                     DEBUT Affichage des informations de trames
                    ********************************************/
    			printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    			printf("TRAME N %d\n",numeroTrame);
     
    			fscanf(stdin,"%s",&ch);
    			//	printf("\n Introduction : %s", ch);
     
    			fscanf(stdin,"%s",&ch);
    			//	printf("\n ma frame : %s", ch);
     
    			fscanf(stdin, "%d",&nb);
    			printf("\n nombre d'octets : %d \n",nb);
     
    			printf("\n Adresse de destination :");
    			for(i; i<=5; i++){
    				fscanf(stdin, "%s",&temp);
    				printf("%s",&temp);
    				_destination = temp;
    			}
     
    			printf("\n Adresse de l'emetteur :");
    			for(i; i<=11; i++){
    				fscanf(stdin, "%s",&temp);
    				printf("%s",&temp);
    				_emission = &temp;
    			}
     
    			printf("\n Type de la donnee :");
    				for(i; i<=13; i++){
    				fscanf(stdin, "%s",&temp);
    				printf("%s",&temp);
    				_type = &temp;
    			}
     
    			printf("\n donnee :");
     
    			while (i != nb){	
    				fscanf(stdin, "%s",&temp);
    				printf(" %s",&temp);
    				i++;
    			}
    		/*******************************************
                     FIN Affichage des informations de trames
                    ********************************************/
    		numeroTrame++;
     
     
    		/*******************************************
                     DEBUT Ecriture Statistiques
                    ********************************************/
    			statsMacDestination(_destination);
    			statsMacEmission(_emission);
    			statsMacTypeDonnees(_type);
    		/*******************************************
                     FIN Ecriture Statistiques
                    ********************************************/
     
     
    		printf("\n\n");
    	}
    	printf("Fin de fichier atteinte \n");
    }
    Les erreurs m'étant renvoyées sous GCC (ubuntu) sont les suivantes :
    main.c: Dans la fonction «main» :
    main.c:57: attention : assignment from incompatible pointer type
    main.c:64: attention : assignment from incompatible pointer type
    main.c:71: attention : assignment from incompatible pointer type
    /tmp/ccUW0R94.o: In function `main':
    main.c.text+0x231): undefined reference to `statsMacEmission'
    main.c.text+0x23c): undefined reference to `statsMacTypeDonnees'
    collect2: ld a retourné 1 code d'état d'exécution
    Pour information, le retour d'une trame par le sniffer est de forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Byte rcv:
    42
    ff ff ff ff ff ff 00 b0 d0 31 f1 46 08 06 00 01 
    08 00 06 04 00 01 00 b0 d0 31 f1 46 c0 a8 0a 04 
    00 00 00 00 00 00 c0 a8 0a fe
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  2. #2
    Membre averti

    Inscrit en
    Juillet 2008
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 186
    Points : 350
    Points
    350
    Par défaut
    Bonjour,

    Il y a un problème dans la partie ci-dessous. Comme temp est déjà un pointeur, il faut le passer directement aux fonctions fscanf et printf. Pas besoin de passer l'addresse du pointeur (&).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char* temp;
    /* ---- 8< ---- */
    fscanf(stdin, "%s",&temp);
    printf("%s",&temp);
    Didier

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par dtrosset Voir le message
    Il y a un problème dans la partie ci-dessous. Comme temp est déjà un pointeur, il faut le passer directement aux fonctions fscanf et printf. Pas besoin de passer l'addresse du pointeur (&).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char* temp;
    /* ---- 8< ---- */
    fscanf(stdin, "%s",&temp);
    printf("%s",&temp);
    Alors en toute logique, il faut retirer les & :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char* temp;
    /* ---- 8< ---- */
    fscanf(stdin, "%s", temp);
    printf("%s", temp);
    Et maintenant, la question qui tue...

    temp pointe sur quoi ?
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Temp correspond aux octets de la trame lus à partir de scanf non?

    Enfin c'est ce que j'ai souhaité représenter.
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Deallyra Voir le message
    Temp correspond aux octets de la trame lus à partir de scanf non?

    Enfin c'est ce que j'ai souhaité représenter.
    Tu n'as pas répondu à la question. Tu ne l'a pas comprise ?

    Quelle est la valeur de temp au moment de l'appel de la fonction ?
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Possible en effet que je n'ai pas comprit votre question.

    Les pointeurs "pointent" vers des zones mémoires afin d'accéder aux valeurs des variables stockées.

    Je ne m'étais pas réellement posée la question car "ça marchait". J'obtenais l'affichage que je souhaitais avoir.

    Mais temp n'étant pas initialisée, cette variable devrait me renvoyer une valeur d'une zone mémoire qui n'a aucun rapport avec ce que je souhaite avoir...

    Je ne sais pas si je suis claire
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  7. #7
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    En fait, après réflexion, il me semble m'être complètement trompée en fonçant dans votre piège (si tant est que s'en était un).

    je déclare au début ma variable temp sans l'initialiser cependant, elle reçoit une valeur lors du scanf.

    Au premier scanf, temp a une valeur inconnue

    C'est le scanf qui lui attribut la valeur stdin.

    Alors quelle était votre réelle question puisque j'ai répondu à coté par deux fois?
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Les pointeurs "pointent" vers des zones mémoires afin d'accéder aux valeurs des variables stockées.
    Ils peuvent stocker l'adresse de zones mémoire, encore faut-il que ces zones mémoires soit préalablement effectivement allouées.


    je déclare au début ma variable temp sans l'initialiser cependant, elle reçoit une valeur lors du scanf.
    Cette variable est un pointeur donc doit stocker l'adresse d'une zone allouée. scanf est incapable de savoir quelles zones mémoire sont allouées et ne peut pas renvoyer quelque chose de correct


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(stdin, "%s", temp);
    temp doit être un tableau suffisamment grand pour contenir tous les caractères de la chaîne +1 pour le zéro terminal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char temp[/*mettre la bonne valeur*/];
    //ou
    char * temp = malloc(/*mettre la bonne valeur*/);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Deallyra Voir le message
    Les pointeurs "pointent" vers des zones mémoires afin d'accéder aux valeurs des variables stockées.
    Bien. Peu de débutants sont capables de sortir ça.

    Je ne m'étais pas réellement posée la question car "ça marchait". J'obtenais l'affichage que je souhaitais avoir.
    Erreur Tout code qui 'tombe en marche' est a priori buggé !

    Plus sérieusement, pour qu'un code soit correct, il faut d'abord que le codage soit conforme au requis du langage. Or passer une valeur indéterminée à une fonction invoque un comportement indéterminé, le pire des bugs...

    http://emmanuel-delahaye.developpez.com/notes.htm#ub

    Un compilateur bien réglé aurait vu l'erreur :

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    Mais temp n'étant pas initialisée, cette variable devrait me renvoyer une valeur d'une zone mémoire qui n'a aucun rapport avec ce que je souhaite avoir...
    Exactement. C'est très précisément ce genre de bug qui entraine un comportement indéterminé. Rappel : tout peut arriver !

    Tu sais donc ce qu'il te reste à faire.
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Deallyra Voir le message
    En fait, après réflexion, il me semble m'être complètement trompée en fonçant dans votre piège (si tant est que s'en était un).
    Non, tu as parfaitement répondu. Il n'y avait aucun piège, juste un petit contrôle de connaissances de bases du C.

    je déclare au début ma variable temp sans l'initialiser cependant, elle reçoit une valeur lors du scanf.
    Par quel miracle ? La doc est claire : scanf() attend l'adresse d'une variable, pas une valeur indéterminée. Aucune fonction n'attend une valeur indéterminée. Ca n'existe pas.

    Au premier scanf, temp a une valeur inconnue
    Absolument. Ce qui entraine un comportement indéterminé. C'est mort.

    C'est le scanf qui lui attribut la valeur stdin.
    Ou la, rien à voir avec stdin...
    Alors quelle était votre réelle question puisque j'ai répondu à coté par deux fois?
    Voir au-dessus.
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    @diogene
    temp doit être un tableau suffisamment grand pour contenir tous les caractères de la chaîne +1 pour le zéro terminal:
    La bonne valeur, il s'agit de 2+1 pour le nombre de caractères ou alors du nombre de bits?

    Je demande car je me pose question quant à votre 0 terminal.

    @Emmanuel Delahaye
    Tu sais donc ce qu'il te reste à faire.
    Régler mon compilateur? Initialiser la variable temp?

    En ce qui concerne le réglage du niveau du compilateur GCC par rapport aux erreurs et warnings, je ne sais pas comment appliquer ces modifications.

    Pour la variable temp, j'ai également attribué une valeur.


    Au niveau de votre exercice sur les UB, l'erreur serait que l'on souhaite entrer une valeur num ( := 12) dans la variable char num_text[] qui serait un tableau "infini" ?

    edit : merci ç vous deux, j'en avais oublié la politesse élémentaire.
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  12. #12
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Après quelques recherches fructueuses, j'ai obtenu quelques réponses quant à la modification du compilateur.

    -Wall -Wextra -O -Wwrite-string -Wstrict-prototypes -Wuninitilized -Wunreachable-code
    Il s'agit des attributs qui sont à rajouter à GCC à chaque compilation.

    J'ai vu qu'il était possible de définir des variables d'environnement et je m'en suis servie pour créer une variable "comp" qui prend tout ces attributs.

    Suite à cela, je me suis confrontée au problème du reboot système et de cette variable qui disparaitrait aussi j'ai vu qu'il pouvait être édité le fichier ~/.bashrc pour rajouter comp en tant que variable d'environnement et il me suffit désormais ( après un source ~/.bashrc) de faire gcc $comp nomFichier.c


    Par contre, ceci ne résoud qu'un problème secondaire quant mon premier post.

    J'aurais tout de même apprit des choses intéressantes, bien que non dépendantes directement du problème C que j'ai.

    edit : à la compilation j'obtiens l'erreur suivante :
    cc1: erreur: option "-Wwrite-string" de la ligne de commande non reconnue
    cc1: erreur: option "-Wuninitilized" de la ligne de commande non reconnue
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  13. #13
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Deallyra Voir le message
    edit : à la compilation j'obtiens l'erreur suivante :
    Quelle est ta version de gcc ?
    Si elle est ancienne, il est possible qu'elle ne supporte pas ces flags...
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    @diogene


    temp doit être un tableau suffisamment grand pour contenir tous les caractères de la chaîne +1 pour le zéro terminal:
    La bonne valeur, il s'agit de 2+1 pour le nombre de caractères ou alors du nombre de bits?

    Je demande car je me pose question quant à votre 0 terminal.
    Il s'agit du nombre de caractères.
    En C, les chaînes de caractères standard sont terminées par le caractère '\0'.
    Les fonctions standard de manipulation des chaînes supposent que les chaînes sont terminées de cette façon.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  15. #15
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Chez moi il s'agit de $ gcc -v

    version gcc 4.2.4 (Ubuntu 4.2.4-1ubuntu3)


    Je \0 est compté comme un caractère?

    Ou seulement le 0 qui sera interprété comme un 0 ?
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  16. #16
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Tu peux déjà commencer par jeter un oeil ICI .
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  17. #17
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Je \0 est compté comme un caractère?

    Ou seulement le 0 qui sera interprété comme un 0 ?
    Le '\0' est 1 caractère qui correspond à un code où tous les bits sont à 0 (donc équivalent à la valeur entière 0). Naturellement, pour le stocker, il faut lui réserver 1 place.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  18. #18
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Deallyra Voir le message
    Chez moi il s'agit de $ gcc -v

    version gcc 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
    C'est une version très récente. Il faudrait approfondir. En attendant, retire les options qui provoquent les erreurs...
    Pas de Wi-Fi à la maison : CPL

  19. #19
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    @ssmario2
    Merci pour ce lien

    @diogene
    ce caractère se place apparement "tout seul" en fin de chaîne pour peu que la place nécessaire soit laissée selon le lien de ssmario2.
    Est-ce ainsi? (ou ais-je mal comprit?)

    @Emmanuel Delahaye
    S'il me faut vous faire parvenir un fichier pour que vous approfondissiez ou que vous souhaitiez que je fasse une manipulation quelconque, n'hésitez pas à demander.


    J'ai modifié le code en fonction de ce que vous m'avez apprit mais il me ressort des warnings qui me déplaisent...

    $ gcc $comp main.c
    main.c:16: attention : return type of «main» is not «int»
    main.c: Dans la fonction «main» :
    main.c:46: attention : format «%d» expects type «int *», but argument 3 has type «int»
    main.c:50: attention : déclaration sasn effet
    main.c:57: attention : déclaration sasn effet
    main.c:64: attention : déclaration sasn effet
    main.c:94: attention : ne sera jamais exécuté
    mon code est désormais le suivant :
    Code c : 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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    //#include "eth_lib.h"
     
     
    int statsMacDestination(char* mac){
    		//system touche fichier
    	FILE *pointeurFichier;
    	pointeurFichier = fopen(mac, "rw");
    	exit(0);
    }
     
     
    void main(void){
    	statsMacDestination("fffffffff");
    	/*******************************************
             Declaration des variables
            ********************************************/
    	int i;			//compteur
    	char ch[51];
    	char* temp = "";
    	int numeroTrame = 1;
    	int nb = 0;			//nombre d'octets dans la trame
    	char* _destination = "";
    	char* _emission = "";
    	char* _type = "";
     
    	while(1){
    		i = 0;
    		//static struct eth_frame;
     
    		/*******************************************
                     DEBUT Affichage des informations de trames
                    ********************************************/
    			printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    			printf("TRAME N %d\n",numeroTrame);
     
    			fscanf(stdin,"%s",ch);
    			//	printf("\n Introduction : %s", ch);
     
    			fscanf(stdin,"%s",ch);
    			//	printf("\n ma frame : %s", ch);
     
    			fscanf(stdin, "%d",nb);
    			printf("\n nombre d'octets : %d \n",nb);
     
    			printf("\n Adresse de destination :");
    			for(i; i<=5; i++){
    				fscanf(stdin, "%s",temp);
    				printf("%s",temp);
    				_destination = temp;
    			}
     
    			printf("\n Adresse de l'emetteur :");
    			for(i; i<=11; i++){
    				fscanf(stdin, "%s",temp);
    				printf("%s",temp);
    				_emission = temp;
    			}
     
    			printf("\n Type de la donnee :");
    				for(i; i<=13; i++){
    				fscanf(stdin, "%s",temp);
    				printf("%s",temp);
    				_type = temp;
    			}
     
    			printf("\n donnee :");
     
    			while (i != nb){	
    				fscanf(stdin, "%s",temp);
    				printf(" %s",temp);
    				i++;
    			}
    		/*******************************************
                     FIN Affichage des informations de trames
                    ********************************************/
    		numeroTrame++;
     
     
    		/*******************************************
                     DEBUT Statistiques
                    ********************************************/
    			statsMacDestination(_destination);
    		/*******************************************
                     FIN Statistiques
                    ********************************************/
     
     
    		printf("\n\n");
    	}
    	printf("Fin de fichier atteinte \n");
    }

    Pourquoi me dit-il que les déclarations des scanf sont sans effet? Egalement, pourquoi me dit-il que le dernier printf ne sera jamais execute?
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  20. #20
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Entre autres choses :
    @diogene
    ce caractère se place apparement "tout seul" en fin de chaîne pour peu que la place nécessaire soit laissée selon le lien de ssmario2.
    Est-ce ainsi? (ou ais-je mal comprit?)
    il est implicite dans les fonctions de manipulation de chaîne (strlen, strcpy, strcat,...)
    Il se place même si la place nécessaire n'est pas allouée (d'où bug à coup sûr)

    main.c:16: attention : return type of «main» is not «int»
    main renvoie TOUJOURS un int

    main.c:46: attention : format «%d» expects type «int *», but argument 3 has type «int»
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(stdin, "%d",&nb);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(i; i<=5; i++){
    				fscanf(stdin, "%s",temp);
    temp n'est pas un tableau modifiable (de plus, de 1 caractère).

    ne fait que copier les adresses, pas le contenu des "tableaux"
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Projet] Programme pour statistiques de fichiers textes
    Par marouane87 dans le forum C++/CLI
    Réponses: 30
    Dernier message: 24/01/2010, 21h51
  2. Faire la statistique d'un fichier
    Par bigey3 dans le forum Langage
    Réponses: 37
    Dernier message: 07/01/2008, 12h48
  3. Réponses: 7
    Dernier message: 09/10/2007, 18h36
  4. Statistiques sur fichier du file system
    Par Shrieker dans le forum Langage
    Réponses: 1
    Dernier message: 20/09/2006, 07h49
  5. statistiques sur les lignes et colonnes d'un fichier
    Par ericbareke dans le forum Langage
    Réponses: 5
    Dernier message: 23/03/2006, 16h09

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