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 :

remplacement d'une sous chaine par une autre sous chaine


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut remplacement d'une sous chaine par une autre sous chaine
    Bonjour,
    J'ai une chaine de caractère.
    je veux faire un remplacement dans des zones de cette chaine.
    par exemple: chaine="AAAAAAAAAA";
    je veux intégrer la sous chaine Schaine="FFFF" dans chaine à la position 5 au 7 donc je vais supprimer les 3 caractère et les remplacer par Schaine.
    donc on va avoir chaine="AAAAFFFFAAA"
    j'ai fait un petit code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void replace_sequence(char *chaine, char *Schaine, int start, int end)
    {
        int i = start;
        int len = strlen(Schaine);
        while (i < end) {
            int j = 0;
            while (j < len)
                chaine[i++] = Schaine[j++];
        }
    qu'est ce que vous pensez de mon code?
    et j'ai une question: comme vous voyez la longueur de chaine change donc comment faire pour la taille de chaine si sa taille change après le remplacement?
    merci pour votre aide.

  2. #2
    Membre actif Avatar de Abacar94
    Homme Profil pro
    L2 Math-informatique
    Inscrit en
    Novembre 2015
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Niger

    Informations professionnelles :
    Activité : L2 Math-informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 103
    Par défaut
    vois ci une procédure qui ne change pas la taille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void replace_sequence(char *chaine, char *Schaine, int start, int end)
        {int I,J=0; 
    	 for(I=start-1;I<end;I++)
    	    {chaine[I]=Schaine[J]; /*I ième indice du caractère de chaine à replacer par le J ième indice de  Schaine*/
    	     J++;
    		}
        }
    elle ne remplace que les 3 élément dans chaine........je sais pas si c'est réellement ce que tu faire mais j t'écoute si ce n'est pas le cas

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    Citation Envoyé par Abacar94 Voir le message
    vois ci une procédure qui ne change pas la taille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void replace_sequence(char *chaine, char *Schaine, int start, int end)
        {int I,J=0; 
    	 for(I=start-1;I<end;I++)
    	    {chaine[I]=Schaine[J]; /*I ième indice du caractère de chaine à replacer par le J ième indice de  Schaine*/
    	     J++;
    		}
        }
    elle ne remplace que les 3 élément dans chaine........je sais pas si c'est réellement ce que tu faire mais j t'écoute si ce n'est pas le cas
    non! bien sur que la taille de chaine va chnger mais moi je veux savoir s'il change est-ce ça n'influe pas sur la déclaration de la longueur de la chaine.
    par exemple: si je déclare la taille de chaine=100 et je fais un remplacement et que la longueur de chaine changera et devient égale à 150. est-ce que je peux avoir les 150 caractères ou non sachant que je déclaré la taille de chaine=100?
    Merci

  4. #4
    Membre actif Avatar de Abacar94
    Homme Profil pro
    L2 Math-informatique
    Inscrit en
    Novembre 2015
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Niger

    Informations professionnelles :
    Activité : L2 Math-informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 103
    Par défaut
    Citation Envoyé par mido1951 Voir le message
    non! bien sur que la taille de chaine va chnger mais moi je veux savoir s'il change est-ce ça n'influe pas sur la déclaration de la longueur de la chaine.
    par exemple: si je déclare la taille de chaine=100 et je fais un remplacement et que la longueur de chaine changera et devient égale à 150. est-ce que je peux avoir les 150 caractères ou non sachant que je déclaré la taille de chaine=100?
    Merci
    la méthode que j'ais adopter écrase les valeur mais elle change pas la taille
    pour ta méthode j'ai une proposition,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int Taille=100;
              chaine[Taille];
    donc en suite tu après l'insertion de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Taille=strlen(chaine)

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    le langage C ne gère pas directement les chaines de caractères.
    Un tableau peut stocker une chaine à la condition : taille du tableau >= 1 + strlen(chaine)

    La taille d'un tableau est une zone de réservation, en aucun cas elle ne peut changer.
    Pour gérer des données de longueurs variables, il faut utiliser de l'allocation dynamique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    const char* chaine1 = "texte";
    const char* chaine2 = "autre";
    // a) determiner taille finale exacte
    int lg = strlen(chaine1) + strlen(chaine2);
    // b) remplir la chaine
    char *bufferChaine = malloc( lg + 1 );
    strcpy(bufferChaine , chaine1);
    strcat(bufferChaine, chaine2);
    // c) utilisation
    printf("%s" , bufferChaine );
    // d) attention, une chaine dynamique doit être libérée après utilisation
    free( bufferChaine );

  6. #6
    Membre actif Avatar de Abacar94
    Homme Profil pro
    L2 Math-informatique
    Inscrit en
    Novembre 2015
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Niger

    Informations professionnelles :
    Activité : L2 Math-informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 103
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    le langage C ne gère pas directement les chaines de caractères.
    Un tableau peut stocker une chaine à la condition : taille du tableau >= 1 + strlen(chaine)

    [/CODE]
    Oui tu a raison mais néanmoins regarde ce code:
    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
     
    #include<stdio.h>
    #include<string.h>
    void replace_sequence(char *chaine, char *Schaine, int start, int end)
        {int I,J=0;
    	 for(I=start-1;I<end;I++)
    	    {chaine[I]=Schaine[J];
    	     J++;
    		}
        }
    main()
    {char chaine[11]= "AAAAAAAAAA",Schaine[5]= "FFFF";
    replace_sequence(chaine,Schaine,5,7);
    printf("\n%s",chaine);
     
    }

  7. #7
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Citation Envoyé par mido1951 Voir le message
    Bonjour,
    J'ai une chaine de caractère.
    je veux faire un remplacement dans des zones de cette chaine.
    par exemple: chaine="AAAAAAAAAA";
    je veux intégrer la sous chaine Schaine="FFFF" dans chaine à la position 5 au 7 donc je vais supprimer les 3 caractère et les remplacer par Schaine.
    donc on va avoir chaine="AAAAFFFFAAA"
    Voici quelques éléments de réponse :

    Tu connais la taille de la partie de chaîne à laquelle va être substituée la chaîne à injecter. Tu peux déterminer la taille de la chaîne à injecter. Grâce à ces deux paramètres tu peux donc également déterminer la différence de longueur entre la chaîne initiale et la chaîne après traitement.

    Si la longueur diminue, tu n'as que de la copie mémoire à faire. Use et abuse de memcpy, c'est fait pour.

    Sinon, tu dois choisir une stratégie : ré-allouer automatiquement de la mémoire pour stocker la nouvelle chaîne ? Faire comme si la taille du tampon de destination était suffisante (confier la responsabilité à l'appelant, c'est souvent la manière C de faire les choses) ? Ne rien faire et renvoyer un code d'erreur ?

    N'oublie pas le caractère de fin de chaîne !

  8. #8
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    donc avec mon code je ne peux pas faire le remplacement?

  9. #9
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Tu as essayé ta fonction avec les paramètres que tu donnes en exemple ?

  10. #10
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonjour
    Citation Envoyé par mido1951 Voir le message
    Bonjour,
    J'ai une chaine de caractère.
    je veux faire un remplacement dans des zones de cette chaine.
    par exemple: chaine="AAAAAAAAAA";
    je veux intégrer la sous chaine Schaine="FFFF" dans chaine à la position 5 au 7 donc je vais supprimer les 3 caractère et les remplacer par Schaine.
    donc on va avoir chaine="AAAAFFFFAAA"
    j'ai fait un petit code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void replace_sequence(char *chaine, char *Schaine, int start, int end)
    {
        int i = start;
        int len = strlen(Schaine);
        while (i < end) {
            int j = 0;
            while (j < len)
                chaine[i++] = Schaine[j++];
        }
    qu'est ce que vous pensez de mon code?
    et j'ai une question: comme vous voyez la longueur de chaine change donc comment faire pour la taille de chaine si sa taille change après le remplacement?
    merci pour votre aide.
    Essayant une autre approche. Vous souhaitez travailler avec des sous-chaînes en remplaçant cette dernière par une autre sous chaîne. Par conséquent, il faut prendre en compte deux éléments importants comme ce qui a pu être dit dans les postes précédents à savoir la taille des deux chaînes de caractères et l'offset de départ.
    En vue de ces deux éléments, on doit appliquer un algorithme (si je peux le dire) qui doit au mieux s'approcher des divers comportements ci-dessous :
    • Si la chaîne de caractères à remplacer est plus grande que la chaîne de caractères que l'on va remplacer la fonction se doit de créer une nouvelle chaîne de caractères et avoir une taille mémoire suffisamment grande pour appliquer les modifications.
    • Dans le cas contraire si la chaîne de caractères a remplacé a une taille inférieure à celle qu'elle remplace il suffit de remplacer les éléments les unes à la suite des autres, mais avec la contrainte de décalé '\0' en fin de chaîne de la chaîne d'origine.
    • Et enfin, si les deux chaînes de caractères, on l'a même taille, on ne fait que remplacer les éléments les unes après les autres ce qui nous donne un code source à chose près qui est ci-dessous:

    Le code source ci-dessous est à revoir et il est susceptible de comporter des erreurs.
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    /*
    *  xStr_Sub_rplc
    *  File: source.c
    *  Version: 0.0.1 GPL V3.
    *  Created by SAMBIA39 on 18/09/2015.
    *  Copyright (c) 2015 SAMBIA39 & Developpez.net
    */ 
     
    #define DEFAULT_START	1
     
    #include <errno.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    /*
     * Fonction qui remplace une sous-chaîne
     * dans une autre sous chaîne.
     * /!\ Attention à ne pas dépasser l'offset max. ( sig 11 )
     */
    char *f_str_inser_sub_str( char *psrc, char *pinsr,
    						   int ofstart, size_t isize ){
     
    	char *ptr = NULL;										// Variable pointeur sur char.
    	const size_t size_src = strlen( psrc );					// Taille chaîne de caractères chaîne source.
    	const size_t size_ins = strlen( pinsr );				// Taille chaîne de caractères sous chaîne a inséré.
    	const size_t size_max = (size_src + size_ins			// Taille allocation nouvelle chaîne.
    							 - isize + DEFAULT_START );
     
    	if( isize == size_ins ){
    		errno = 0;
    		if( NULL == (ptr = strdup( psrc )) ){
    			fprintf( stderr, "(%d)\t:%s\n\t:%s\n", errno,
    				"Erreur copy str", strerror(errno) );
    			return NULL;
    		}
    		if(  DEFAULT_START == size_ins )
    			*( ptr + ofstart ) = *pinsr;
    		else
    			memcpy( ( ptr + ofstart ), pinsr, isize );
    		return ptr;
    	}else{
     
    		errno = 0;
    		if( NULL == ( ptr = (char*)calloc( size_max, sizeof(char) ))){
    			fprintf(stderr, "(%d)\t:%s\n\t:%s\n", errno,
    					"Allocation new inser sub str", strerror(errno) );
    			return NULL;
    		}
     
    		memcpy( ptr, psrc, ofstart );
    		memcpy( ( ptr + ofstart ), pinsr, size_ins );
    		memcpy(  ( ptr + ofstart + size_ins),
    				 ( psrc + ofstart + isize),
    				 ( size_src - isize - ofstart + DEFAULT_START ) );
    		return ptr;
    	}
     
    }
     
    /*
     * Fonction Principal
     */
    int main( void ){
     
    	char *ptr = strdup( "AAAAAAAAAA" );
    	char *ptr_ins = strdup( "FFFF" );
     
    	ptr = f_str_inser_sub_str( ptr, ptr_ins, 5, NULL );
     
    	/*
    	 * /!\ Attention à ne pas dépasser l'offset max.
    	 * Exemple ci-dessous.
    	 */
    	//ptr = f_str_inser_sub_str( ptr, ptr_ins, 5, 7 );
     
    	//Alternative.
    	//ptr = f_str_inser_sub_str( ptr, ptr_ins, 5-1, 7 );
     
     
    	if( NULL == ptr )
    		exit( EXIT_FAILURE );
    	fprintf( stdout, "[Out]\t: %s\n", ptr );
     
     
    	free( ptr );
    	free( ptr_ins );
    	ptr_ins = ptr = NULL;
     
    	return EXIT_SUCCESS;
    }
    Code Out : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [Out]	: AAAAAFFFFAAAAA
     
    Process finished with exit code 0
    à bientôt

Discussions similaires

  1. Réponses: 31
    Dernier message: 15/12/2015, 17h31
  2. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  3. Remplacer une sous chaîne par une autre
    Par Erakis dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 10/11/2006, 09h16
  4. remplacement d'une chaine par une autre
    Par zalalus dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/07/2006, 10h09
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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