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 :

Insertion dans un tableau de caractères


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Points : 66
    Points
    66
    Par défaut Insertion dans un tableau de caractères
    Bonjour,

    J'ai codé un programme pour insérer un caractère dans un tableau de caractères, mais ça me tronque la dernière lettre du tableau. Pourtant je rajoute un caractère vide à la fin du tableau avant de faire l'insertion :

    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 <stdlib.h>
    #include <time.h>
     
    #define NMAX 50
     
    void gen_aleat( char v[], int n )
    {
     int i;
     /* rand() retourne un entier aléatoire de l'ens {0,1,2,..,RAND_MAX} (RAND_MAX fixé à 32767 sous VC++)*/
     for(i = 0; i < n; i++) v[i] = rand()%(122-97) +97;/* pour avoir aussi des nbrs<0 */
    }
     
    void aff_vect( char v[], int n )
    {
     int i;
     for( i = 0; i < n; i++ )
     {
    	 printf( "%c", v[i] );
         if ( (i+1) % 10 == 0 ) printf( "\n" );
     }
     printf( "\n" );
    }
     
    void insere (char v[],int n, int e, int ind)
    {
        int i;
     
        i = n-2;
        while (i >= ind)
        {
            v[i+1]=v[i];
            i=i-1;
        }
        v[ind]=e;
    }
     
    int main()
    {
        char v[NMAX];
        int n;
        int ok;
        char e;
        int ind;
     
        srand(time(NULL));
     
        do
        {
         printf( "Entrer le nb d'elements du vecteur ( <= %d ) : ", NMAX );
         ok = scanf( "%d", &n );
    	 while( getchar( ) != '\n' );  /* ou fgets(vb,80,stdin)  avec  char vb[81];  */
       }while( !ok || n < 0 || n > NMAX );
     
        gen_aleat( v, n );
        printf( "Voici le tableau genere :\n" );
        aff_vect( v, n );
     
        v[n]=' ';
     
        printf("Entrer le caractere a inserer : ");
        scanf( "%c", &e );
        while( getchar( ) != '\n' );
     
        do
        {
            printf("Entrer l'indice ou vous voulez inserer l'element : ");
            ok = scanf( "%d", &ind );
            while( getchar( ) != '\n' );
        } while (!ok || ind < 0 || ind >= n);
     
        printf("Voici le tableau genere apres insertion : \n");
        insere(v,n,e,ind);
        aff_vect( v, n );
     
        return 0;
    }

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 681
    Points
    13 681
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    ?


    EDIT : le code est peut-être plus clair avec une boucle for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void insert (char* array, int len, int to_insert, int index)
    {
        for(int i = len; i >= index; i--)
        {
            array[i + 1] = array[i];
        }
        array[index] = to_insert;
    }
    En gros, depuis la position du dernier caractère jusqu'à la position où je dois insérer, je décale d'un cran. Ensuite, j'insère.

  3. #3
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Points : 66
    Points
    66
    Par défaut
    Oui effectivement il faut mettre i = n-1, mais ça ne marche toujours pas.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 670
    Points : 10 677
    Points
    10 677
    Par défaut
    Citation Envoyé par Bktero Voir le message
    EDIT : le code est peut-être plus clair avec une boucle for :
    Ton code est vraiment, mais vraiment sale beurk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void insert(char* array, unsigned int len, int to_insert, unsigned int index) {
        if ((array == NULL) || (len == 0) || (index > (len - 1))) { return; }
     
        if ((len == 1) || (index == (len - 1))) { array[len - 1] = to_insert; return; }
     
        for(unsigned int i = len - 2; i >= index; --i) {
            array[i + 1] = array[i];
        }
        array[index] = to_insert;
    }
    Par contre, la dernière valeur va être écrasée

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Citation Envoyé par Armays Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /* ou fgets(vb,80,stdin)  avec  char vb[81];  */
    Non, fgets() récupère n-1 caractères justement pour garder l'espace pour le '\0'.
    Donc soit /* ou fgets(vb,80,stdin) avec char vb[80]; */, soit /* ou fgets(vb,81,stdin) avec char vb[81]; */.

    Perso je préfère cette écriture: /* ou fgets(vb,80 + 1,stdin) avec char vb[80 + 1]; */ qui montre à tout relecteur que j'ai bien pensé au '\0'...

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 9
    Points : 16
    Points
    16
    Par défaut
    Regarde bien ton dernier appelle d'affichage. Ton tableau augmente d'une case et tu en affiche toujours le même nombre (n). Essaye un aff_vect( v, n +1); ou alors un petit n++ juste après ton insertion et cela devrait mieux fonctionner.

    Pour palier ce problème de facon plus générale, passe n par adresse (pointeur) et augmente le de 1. Cela garanti que tu augmente la taille de ton tableau à chaque appelle de ta fonction. Si non tu dois toujours faire un n++ juste avant ou juste après chaque appel. De plus il faut rajouter un test sur n pour éviter de dépasser NMAX

    Encore un autre moyen, met le caractère null (\0) a la fin de ta chaîne, et dans ta fonction d'affichage, affiche les caractères jusqu'au caractère null à l'aide d'un while(v[i]) par exemple.
    Je préfère le second qui évite les pointeurs et les effets de bords inutils, et tu n'as plus besoin de passer n en paramètre (cela fonctionne parce que tu utilise des caractères, dans un tableau de int pouvant être null, il faut passer la taille du tableau en paramètre)

    Bonne soirée !

  7. #7
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Points : 66
    Points
    66
    Par défaut
    Merci beaucoup ça marche !!

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

Discussions similaires

  1. Insertion de donneés StringTokenizer dans un tableau de caractères
    Par missvan16 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 21/01/2011, 12h05
  2. insertion dans un tableau de byte
    Par hamma2 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 19/04/2007, 10h02
  3. Réponses: 8
    Dernier message: 28/12/2006, 11h42
  4. [VB6] Insertion dans une chaine de caractères
    Par jerzy59 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 15/05/2006, 13h54
  5. Réponses: 16
    Dernier message: 02/12/2005, 10h39

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