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 :

Fusion de tableau sans rien faire


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 15
    Points : 4
    Points
    4
    Par défaut Fusion de tableau sans rien faire
    Bonjour, débutant en C dans une FAC maths-info je me retrouve face à un problème que je n'ai jamais croisé avant.

    Donc j'ai mon main, je créé mes deux tableaux de type char avec 5 cases, je demande à l'utilisateur de les remplir. J'affiche pour voir que tout s'est bien déroulé mais une fois le second tableau rempli, le premier tableau qui n'avait que 5 cases se retrouve avec 10 cases et contient ce que contenait les deux tableaux !

    Je n'ai strictement rien fait et mes tableau ont fusionnés, je ne comprend pas pourquoi et je traîne dessus depuis un petit moment. Si quelqu'un d'entre vous peut me répondre, ou connait le problème, si j'ai mal écrit un truc ou autre, je l'en remercie d'avance.

    Merci !

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
      char tableau[5];
      char tableau2[5];
      int i;
     
      printf("Remplir le tableau :\n");
      scanf("%s",tableau);
      printf("Tableau = %s\n",tableau);
     
      printf("Remplir le tableau 2 :\n");
      scanf("%s",tableau2);
      printf("Tableau2 = %s\n",tableau2);
     
      for(i = 0 ; tableau[i] != '\0' ; i++)
        {
          printf("i = %d\n",i);
          printf("Tableau = %c\n",tableau[i]);
        }
     
      return 0;
    }

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Combien de caractères tapes-tu ?
    Ici possédant des tableaux de taille 5, tu ne peux en taper que 4 auxquels s'ajoute le caractère final '\0' marquant la fin de la chaîne.
    La fonction scanf() n'effectue aucun contrôle de la taille maximale disponible, ainsi si tu en tapes plus que ce que le tableau ne peut en contenir, elle continuera à écrire à la suite dans la mémoire, peu importe ce qui s'y trouve. Tu te retrouveras donc avec un comportement indéterminé.

    Je te conseille cette lecture.
    Dernière modification par Invité ; 23/03/2019 à 14h02.

  3. #3
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    Il ne faut pas oublier la structure même des chaînes de caractères, qui sont une séquence contiguë de caractères terminée et incluant le premier caractère nul.

    Citation Envoyé par C11 (n1570), § 7.1.1 Definitions of terms
    A string is a contiguous sequence of characters terminated by and including the first null character.
    Or, tu sembles oublier de prendre en compte ce caractère nul. Quand tu déclares tes identificateurs tableau et tableau2, tu les déclares en tant que tableau de cinq caractères, ce qui n'est suffisant que pour stocker quatre caractères, car il faut un byte pour le caractère de fin de chaîne. Ce qu'il se passe sans doute lors de l'exécution, c'est que tu entres cinq caractères. Force est de constater que ton compilateur n'a inséré aucun byte de padding entre tes deux variables, ce qui fait qu'elles sont contiguës en mémoire. Le caractère de fin de chaîne de tableau est écrit en tableau2[0]. Lors du scanf suivant, ce caractère est effacé par les cinq caractères de tableau2. Le caractère nul est ensuite écrit un byte après, une zone qui semble t'être allouée.

    Tout cela n'est donc qu'une succession de (mal)chance, car ce que tu fais est un comportement indéfini. En théorie, tout peut donc arriver. Ici, tu as un comportement observable étonnant, mais ça pourrait être encore pire : le programme pourrait fonctionner correctement. Et là, pour déboguer, c'est encore plus l'enfer... Une utilisation intelligente de la fonction scanf aurait pu te permettre d'éviter cela, en fixant le nombre maximal de caractères à lire sans déborder des bornes du tableau. Cependant, scanf est, de manière générale, adaptée pour les entrées formatées. Ce n'est pas le cas des entrées humaines. Utilise plutôt fgets quand il s'agit de récupérer une ligne de manière standard.

    Bonne journée !

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    D'accord je vois, en fait j'avais simplement oublié que le '\0' occupait une case dans celles que je définissait avec la variable. Je pensais que je définissais 5 cases et qu'il se mettait après celles ci.

    Ce n'était qu'un bête oublie je suis désolé.

    Mais dans ce cas là je pensais que sans le '\0' ça m'aurait affiché une suite de nombre de la mémoire, je pensais pas que les tableaux serait l'un à la suite de l'autre. Comprenez que je voulais justement faire une fonction de concaténation comme strcat, alors j'ai un peu été perturbé en voyant que sans rien faire ça le faisait.

    Du coup j'ai une question. Imaginons que nous voulons demander à l'utilisateur de rentrer un par un les information d'un carte d'identité, genre le numéro du sexe, puis les dates etc. Y a t'il un risque de faire comme je l'avais fais ?

    Du genre ça écrit tout à la suite dans le premier tableau donc, sans avoir à faire de concaténation.

    Merci pour vos réponse et merci Winjerome pour le document.

Discussions similaires

  1. attendre sans rien faire avec un timer
    Par ol9245 dans le forum MATLAB
    Réponses: 3
    Dernier message: 29/12/2011, 15h18
  2. Comment faire un tableau sans le $key
    Par pierrot10 dans le forum Langage
    Réponses: 5
    Dernier message: 17/10/2010, 22h00
  3. [VxiR2] Filtre sur un tableau sans faire sauter les lignes sans données
    Par tatayoyo dans le forum Deski
    Réponses: 3
    Dernier message: 20/03/2009, 10h35
  4. Une procédure qui passe mais sans rien faire
    Par Bizoo dans le forum PL/SQL
    Réponses: 18
    Dernier message: 20/11/2008, 13h31
  5. Windows Service Demarre et Arrête sans rien faire
    Par Bobafett dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/02/2007, 17h32

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