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 :

Copier une chaine dans elle même


Sujet :

C

  1. #1
    Membre du Club
    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
    Points : 65
    Points
    65
    Par défaut Copier une chaine dans elle même
    bonjour,
    Je veux faire une copie d'une partie d'une chaine dans elle même et supprimer l'ancienne.
    j'ai utilisé la fonction strncpy() mais ça marche pas.
    voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    len = table[i].posend-table[i].posin; // pour déterminer la longueur
        strncpy(table[i].qseq,table[i].qseq,len); // copier la chaine dans elle même et supprimer l'ancienne
    ici ça marche pas.
    Même que j'utilise une autre chaine parexemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *chaine;
    len = table[i].posend-table[i].posin; // pour déterminer la longueur
        strncpy(chaine,table[i].qseq,len); // copier la chaine dans elle même et supprimer l'ancienne
    ici ça marche dans des cas et il y a des cas que ça marche pas.
    si par exemple: len=2000 donc longueur de chaine=2000.
    si len=500 donc longueur de chaine =2000!!elle reste l'ancienne.
    Mais Bon Moi je veux copier la nouvelle chaine dans l'ancienne.
    Est-ce que vous avez une solution?
    Merci

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 435
    Points : 43 070
    Points
    43 070
    Par défaut
    Il te faut commencer par la doc des fonctions que tu utilises :

    La fonction strcpy() copie la chaîne pointée par src (y compris l'octet nul « \0 » final) dans la chaîne pointée par dest. Les deux chaînes ne doivent pas se chevaucher. La chaîne dest doit être assez grande pour accueillir la copie.
    tu veux que ta chaine destination contienne la chaine source 2 fois si j'ai bien compris ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    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 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Si tu veux faire un traitement "in-place", il faut

    1. Adapter la longueur chaîne avec la nouvelle. Si la nouvelle est plus petite tu peux ne rien faire. Sinon soit delete/ new free/ malloc soit realloc
    2. Et recopier la nouvelle avec une boucle for



    Édit: , Matt_Houston

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Alternativement la fonction memmove est l'équivalent de memcpy pour opérer depuis et vers des zones mémoire qui se chevauchent et est idéale dans ton cas. Attention le traitement se fait sur un tampon quelconque (pas forcément une chaîne), il faut donc gérer le caractère nul a la mano :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char str[] = "2001, L'Odyssee de l'Espace";
    char *substr_start = &str[6];
    size_t substr_len = 9;
     
    memmove(str, substr_start, substr_len);
    str[substr_len] = '\0'; // terminaison de la chaîne
     
    printf("'%s'\n", str); // affiche : 'L'Odyssee'
    Garde en tête que la zone mémoire après le caractère nul existe toujours après la « réduction » de la chaîne.


    Citation Envoyé par foetus Voir le message
    Sinon soit delete/ new soit realloc
    Pas en C, non.

  5. #5
    Membre du Club
    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
    Points : 65
    Points
    65
    Par défaut
    moi je veux copier une partie d'une chaine dans elle même et supprimer l'ancienne.
    exemple:
    table[i].seq="ABCDEFGHIJK"
    Je veux copier les 5 premiers caractères dans table[i].seq (elle même) et supprimer l'ancienne.
    d'après vos messages c'est impossible avec strncpy().

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    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 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Citation Envoyé par mido1951 Voir le message
    exemple:
    table[i].seq="ABCDEFGHIJK"
    Je veux copier les 5 premiers caractères dans table[i].seq (elle même) et supprimer l'ancienne.
    Nom : ane.gif
Affichages : 95
Taille : 136 octets if (new_size < old_size) { table[i].seq[new_size] = '\0'; } Nom : ane.gif
Affichages : 95
Taille : 136 octets

  7. #7
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 149
    Points : 28 116
    Points
    28 116
    Par défaut
    Citation Envoyé par mido1951 Voir le message
    exemple:
    table[i].seq="ABCDEFGHIJK"
    Je veux copier les 5 premiers caractères dans table[i].seq (elle même) et supprimer l'ancienne.
    Si ton cas d'utilisation se limite exclusivement aux N premiers caractères de la chaîne, alors la commande donnée par foetus est la bonne, et tu n'as aucune copie à faire.

    Sinon, si tu veux pouvoir copier n'importe quelle sous-chaine au début de ta chaîne, il faut que tu comprennes ce que ça implique algorithmiquement parlant. D'ailleurs, tu peux le faire a la main avec une boucle for, ça serait un bon exercice à mon avis.
    Je reprends ton exemple : j'ai ABCDEFGHIJK, et je veux copier CDEFGH au début de ma chaine. J'écris donc une boucle for, qui commence à ... et qui ...
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  8. #8
    Membre du Club
    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
    Points : 65
    Points
    65
    Par défaut
    if (new_size < old_size) { table[i].seq[new_size] = '\0'; }
    oui c'est la solution.
    se sont que les n premières caractères.
    Merci.

  9. #9
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Ta chaîne occupera donc la même quantité d'espace mémoire qu'auparavant.

    Si c'est ce que tu veux obtenir, alors c'est tout bon.

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

Discussions similaires

  1. [XL-2003] Copier une feuille dans le même classeur et la renommer dans la foulée
    Par Un Internaute dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 02/12/2015, 14h25
  2. Réponses: 4
    Dernier message: 20/06/2012, 10h48
  3. [XL-2003] Formulaire, copier une textbox dans la même ligne que les autres
    Par jbelleng dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/08/2011, 13h25
  4. VB.NET - Copier une chaine dans le presse-papiers
    Par hibou28 dans le forum VB.NET
    Réponses: 4
    Dernier message: 19/11/2009, 22h38
  5. Réponses: 3
    Dernier message: 26/05/2006, 19h49

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