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 lors de la copie de chaine caractère.


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Problème lors de la copie de chaine caractère.
    Bonsoir à tous,

    Lorsque je copie une chaine1 de caractère dans une chaine2 avec une taille par exemple de 5, la chaine2 que je vais trouvé contiendra bien les 5 caractères copié mais aussi des caractères spéciaux. Donc cette chaine que j'ai initialisé à une taille 5 change de taille.

    J'ai pensé crée un tableau temporaire à la bonne taille pour recopier uniquement les 5 premiers caractères de chaine2 afin de ne plus avoir ces caractères spéciaux inconnus à la fin. Mais le résultat est le même.

    Est ce un défaut du compilateur(mingw)? Ou est ce que y a quelque chose qui m'a échappée?


    Je vous laisse une partie du code compilable et qui vous montre le problème.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main()
    {
     
    char w[] = "test retest test";
    char tmp[finMot(1, w)];
    mot(1,w,tmp);
    printf("Le 1er mot est %s/", tmp);
    return 0;
    }
     
    void mot(int n, char c[], char mot[]){//renvoie le niéme mot de la chaine c  dans la chaine mot
        int numMot = 0;
        int debutMot = 0;
        int i=0;
        int finMot=0;
        for(i =0; i<taille(c)-1; i++){
            if(c[i] != 32 && c[i+1] == 32){
                finMot = i+1;
                numMot++;
                if(numMot == n){
                    break;
                }else{
                debutMot =i+2;//si entre chaque mot y a qu'un seul espace
                }
            }
        }
        for(i =debutMot; i<finMot; i++){
            mot[i-debutMot] = c[i];
        }
     
    }
     
    int finMot(int n,char c[]){// renvoie l'index de la fin du nieme mot dans la chaine c
        int finMot = 0;
        int numMot = 0;
        int debutMot = 0;
        int i=0;
        int p=0;
        for(i =0; i<taille(c); i++){
            if(c[i] != 32 && c[i+1] == 32){
                p = i+1;
                numMot++;
                if(numMot == n){
                    break;
                }else{
                debutMot =i+2;//si entre chaque mot y a qu'un seul espace
                }
            }
        }
        return finMot;
    }
     
    int taille(char c[]){
        int i = 0;
        while(c[i] != '\0'){
            i++;
        }
        return i;
     
    }
    P.S. Je pose pas mal de question en ce moment, mais j'ai beaucoup (mal?) cherché sur le net, fais (je crois) tous les tests possibles mais c'est surtout que le forum est actif et regorge de gens compétents et sympas.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Hello,


    On a toujours envie d'accuser le compilateur (et des bugs du style "interaction cosmique", j'en ai vu !), malheureusement (enfin, pour mon expérience), il y avait toujours un bug dans mon code
    Honnêtement, il n'y a aucune chance que tu trouves un bug sur ce genre de programmes simples. Tu n'as peut-être pas idée de la base de tests titanesque que doit passer gcc (et mingw) avant de sortir ne serait-ce qu'en version "release candidate" !

    Bref, c'était le petit aparté
    Pour ton code, il me semble juste que tu oublies de recopier un \0 terminal à la toute fin de ta fonction mot(), du coup il t'affiche de la mémoire non initialisée (ce qui peut provoquer une segfault si tu vas trop loin!). Pour le reste, je n'ai pas vraiment fait attention !

    Sinon, je vois que tu as codé une fonction "taille", qui est en fait le clone de "strlen" (dans string.h) !
    C'est très bien pour apprendre, mais au cas ou, il vaut mieux utiliser les versions "standard" en général, surtout pour la lisibilité du code (tout le monde connait strlen), et dans une moindre mesure, pour les optimisations : en assembleur x86, strlen se code en 1 ligne ou presque (instruction "repne scasb"), mais si tu regardes la sortie de ton compilateur (mingw) sur ta fonction taille, il va te sortir un code beaucoup plus naïf avec une flopée d'instructions, et ce même avec les optimisations maximum (je viens de tester avec gcc 4.4) : au final, tu y perds sur tout les plans, même avec du code "parfait"

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Génial ça fonctionne!

    Pour strlen j'ai voulu l'utiliser aussi mais il donnait des résultats surprenant à cause de ce '\0'.

    Un grand merci à toi.

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

Discussions similaires

  1. WinNT4 : problème lors de la copie de fichiers volumineux
    Par perceval_attitude dans le forum Windows 2000/Me/98/95
    Réponses: 4
    Dernier message: 02/09/2014, 22h04
  2. [Toutes versions] Problème lors d'une copie de tableau
    Par Florian.R dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/12/2010, 11h05
  3. Réponses: 7
    Dernier message: 11/05/2009, 14h53
  4. Problème lors d'une copie
    Par Swiper dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 24/08/2007, 12h19
  5. Problème Lors d'un copie de base
    Par 79Charles dans le forum Administration
    Réponses: 17
    Dernier message: 19/08/2004, 15h13

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