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 :

Problème de code (concaténation de chaines)


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 67
    Points : 41
    Points
    41
    Par défaut Problème de code (concaténation de chaines)
    Voilà, j'ai ecrit ce code dans le but de m'exercer à la manipulation des tableaux et chaines de caractères, le but etant d'afficher une chaine : "BONJOUR MARC" à l'écran...
    Seulement voilà deux problèmes se posent :

    1) Ce programme affiche bien la chaine demandée mais lorsque l'on appuie sur une touche pour continuer, une erreur debug Visual C++ s'affiche :

    Run-Time check failure #2- Stack around the variable 'tab2' was corrupted

    2) Si je modifie tab1[]={'B','O','N','J','O','U','R','R','R','\0'}; par exemple, alors la chaine affichée n'est même plus correcte elle affiche qqch comme ca :

    BONJOURRR |'||||BONJOURRAfficher une touche pour continuer...

    (un truc comme ca tout parasité...)


    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
     
     
    #include "stdafx.h"
    #include <iostream>
    #include <stdio.h>
     
    int main(int argc, char* argv[])
    {
     
    	char tab1[]={'B','O','N','J','O','U','R','\0'};
    	char tab2[]={'M','A','R','C','\n','\0'};
    	char tab3[]={' '};
     
    	int tab1_size=sizeof(tab1),tab2_size=sizeof(tab2);
     
    	for (int i=0;i<=(tab1_size+tab2_size);i++)
    	{
    		if (i<tab1_size)
    			tab1[i]=='\0'?tab3[i]=' ':tab3[i]=tab1[i];
    		else
    			tab3[i]=tab2[i-tab1_size];
    	}
     
    	printf(tab3);
     
    	system("pause");
    	return 0;
    }

    Je ne comprend vraiment pas le problème, pouvez-vous m'aider ?
    Merci d'avance !

    PS : Ne me dites pas d'utiliser string.h ce n'est pas le but de mon 'exercice d'entrainement...'

  2. #2
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Déja, ton tab3 n'est pas assez grand pour recevoir toute la chaine, tu devrais le declarer comme ça :

    Histoire d'etre sûr d'avoir ase de memoire allouée

    Ensuite, il me semble que sizeof renvoit la taille de la mémoire allouée et non pas le nombre d'elements du tableau.

    Or, si tab1 contient par exemple, 5 caracteres, le systeme n'alloue forcement pas 5 octets mais plutot 8 pour des raisons de performances.

    (alignement de la zone mémoire et autres)

    Tu devrais donc plutot eviter de te basé sur sizeof() qui est dependant du systeme mais compter les caracteres "à la main".

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 67
    Points : 41
    Points
    41
    Par défaut
    Ok,merci beaucoup en effet, ca résoud tous les problèmes...
    Par contre ca ne me permet pas d'adapter mon code facilement pour l'affichage de chaines quelconques... (nécéssité de re-compter les caractères a chaque fois... :/) Je vais voir si je peux faire autrement, les idées sont les bienvenues ^^

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    salut,
    en C on utilise strlen pour obtenir la taille d'une chaine de caractère (qui compte jusqu'au \0, exclus).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char chaine[64];
    strcpy(chaine, "BONJOUR MARC");
    int size = strlen(chaine);
    En C++, on utilise std::string et std::string::length() ou size()
    http://c.developpez.com/faq/cpp/?page=strings

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 67
    Points : 41
    Points
    41
    Par défaut
    Ah... Ok lol j'avais pas pensé à Strlen...
    Pour les string je suis au courant, mais le but était plus de faire de la manipulation de tableaux, conditions etc que de faire du c++ correct
    Merci beaucoup pour l'aide

  6. #6
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Le C++ correct c'est avec les std::string, pas les char*

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    c'est une question C surtout

  8. #8
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    S'il veut obtenir des solutions C à son problème, le mieux est de poster dans le forum C.
    En C++, la gestion de chaines de caractères se fait avec les chaines standards.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/01/2012, 14h58
  2. Réponses: 2
    Dernier message: 07/06/2008, 16h23
  3. Réponses: 2
    Dernier message: 08/03/2008, 14h24
  4. Probléme de code non portable
    Par Stany dans le forum Windows
    Réponses: 2
    Dernier message: 23/08/2005, 11h02

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