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 :

Programme simple de formatage de numéros de téléphone


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Par défaut Programme simple de formatage de numéros de téléphone
    Bonjour à tous,
    Je suis vraiment très peu doué en C mais j'aurais besoin de faire un programme qui formate un fichier contenant des numéros de téléphone.

    Par exemple : un fichier nommé "numero.txt" contient au départ :
    06,00,00,00,00
    06,00,00,00,00
    06,00,00,00,00
    06,00,00,00,00
    06,00,00,00,00
    06,00,00,00,00
    06,00,00,00,00
    06,00,00,00,00

    à la fin il devrait contenir :

    0600000000,0600000000,0600000000,0600000000,0600000000,0600000000,0600000000,0600000000

    Donc plus d'espace ni de passage à la ligne et suppression des virgules de séparation des chiffre 2 à 2 mais rajout de séparation 10 à 10.

    J'ai commencé à codé ça : (je sais que je code comme un sagouin j'en suis désolé mais je n'arrives vraiment pas à m'y mettre au C)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char *argv[]) {
       FILE* fichier = NULL;
       fichier = fopen("numero.txt", "r+");
       char chaine[2000];
       char tmp = 'a';
       char temp[1];
       int c1 = 0;
     
       if (fichier != NULL)
       {
       	// Boucle de lecture des caractères un à un
       	do
       	{
           	tmp = fgetc(fichier); // On lit le caractère
           	if ((tmp < '0') || (tmp > '9')) {
       		} else {
       			temp[0] = tmp;
       			strcat(chaine, temp);
       			c1 += 1;
       			if (c1 % 10 == 0) {
       				strcat(chaine, ",");
       			}
       		}
     
       	} while (tmp != EOF);
       	printf("%s", chaine);
     
       	fclose(fichier);
       }
       else
       {
       	// On affiche un message d'erreur si on veut
       	printf("Impossible d'ouvrir le fichier numero.txt");
       }
       return 0;
    }
    Je me retrouve avec une erreur de segmentation et je n'arrive pas à m'en dépatouiller.

    Merci d'avance pour votre aide.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Tu as au moins une erreur ici :
    temp est un tableau de char de 1 caractère

    quand tu fais temp[0] = tmp;
    ta chaine temp n'est pas "zero terminated" et donc il est probable que le strcat() plante ensuite.

    Au fait, le debugger, c'est pas fait pour les chiens, cela aide justement à localiser (et résoudre) ce genre de problèmes.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Au fait, question subsidiaire, comment tu feras lorsque tu aura 200 numéros de téléphone ou plus dans ton fichier "numero.txt" ?

    Je te parie un autre crash lorsque la variable chaine[2000] va déborder
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Par défaut
    Merci pour ta réponse, mais qu'est ce que "zero terminated" et que dois-je faire pour qu'elle le soit ?

    Sinon pour la longueur de la chaîne, j'ai fixé 2000 un peu au hasard, mais à priori on ne devrait jamais dépasser se nombre quand on utilisera le programme, on sera de très loin en dessous.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    mais qu'est ce que "zero terminated" et que dois-je faire pour qu'elle le soit ?
    Quelqu'un n'a pas été attentif au cours sur les chaines de caractères

    En C, une chaine de caractères est une suite d'objets de type char, placés de manière continue en mémoire. Comment savoir où se termine cette suite sachant qu'une variable char* ou char[] ne donne que l'adresse du premier élément de cette suite ? La réponse est que cette suite doit être terminée par un caractère spécial indiquant sa fin. Ce caractère en C est '\0' qui vaut 0 (zéro), aussi appelé NUL. D'où le terme de "zero terminated" ou "null terminated".

    Pour ce qui est du code lui-même, pour faire un IF vide et tout faire dans le ELSE et non inverser la condition ? De plus, il existe une fonction isdgit() qui pourrait rendre ton code plus clair (c'est un détail bien sûr).

    strcat() n'est peut-être pas la fonction la plus adaptée à ton besoin. Elle est fait concaténer deux chaines (null terminated donc ^^) et toi tu veux ajouter un caractère dans un tableau. Pourquoi ne pas écrire dans chainedirectement si tmpest OK et une virgule si besoin ? D'ailleurs, tu as vu le mic mac que tu es obligé de faire à cause de strcat(), tmpet temp?

    Quant au problème évoqué par Raymond, tu peux simplement ouvrir ton fichier, déterminer le nombre de numéros de téléphone (soit exactement en comptant le nombre de lignes, soit de manière peut-être moins exact en regardant la taille du fichier avec ftell()), faire une allocation dynamique avec malloc() de la bonne taille et le tour est joué. Ou allouer une taille qui parait OK pour la plupart des fichiers et réallouer si le fichier est trop grand.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    J'oserais, et sans vouloir froisser Tolhsadum car on a tous débuté, je dirais que ce que tu dis est parfaitement valide (isdigit(), ftell(), malloc(), ...) mais d'un niveau encore trop élévé par rapport à ce qui est présenté.

    Donc d'abors, une correction immédiate du problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char temp[2];
    ...
    temp[0] = tmp;
    temp[1] = 0; /* c'est cette ligne qui fait le "zero terminated" de la chaine */
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer le numéro de téléphone entrant
    Par louisss dans le forum Access
    Réponses: 23
    Dernier message: 26/07/2023, 18h21
  2. [XL-2013] Formatage numéro de téléphone
    Par Graineur dans le forum Excel
    Réponses: 4
    Dernier message: 24/06/2014, 20h37
  3. Réponses: 1
    Dernier message: 13/04/2009, 12h14
  4. récuperation d'un numéro de téléphone
    Par herzleid dans le forum Delphi
    Réponses: 4
    Dernier message: 17/07/2007, 09h25
  5. [ODBC] Formatage d'un numéro de téléphone
    Par loganblack dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 01/08/2006, 14h12

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