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 :

Remplacer Antislash par double Antislash


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Aruba

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 23
    Points : 19
    Points
    19
    Par défaut Remplacer Antislash par double Antislash
    Bonjour,
    Voici mon problème :
    comment remplacer l'antislash par un double antislash
    exemple pour : C:\dossier\I\toto.text
    je voudrais faire ceci :
    C:\\dossier\\I\\toto.text

    J'avais trouve cette fonction pour le remplacement :
    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
    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
    /* Retourne une nouvelle chaîne dans laquelle toutes les occurrences d'une chaîne spécifiée dans l'instance actuelle sont remplacées par une autre chaîne spécifiée. */
    char* replace(char* text, char* replace, char* element) {
      int i, j, k;
     
      int searchSize = strlen(text);
      int replaceSize = strlen(replace);
      int size = strlen(element);
     
      char* ret;
     
      if (!searchSize) {
        ret = malloc(size + 1);
        for (i = 0; i <= size; i++) {
          ret[i] = element[i];
        }
        return ret;
      }
     
      int retAllocSize = (strlen(element) + 1) * 2; 
      ret = malloc(retAllocSize);
     
      int bufferSize = 0; 
      char* foundBuffer = malloc(searchSize); 
     
      for (i = 0, j = 0; i <= size; i++) {
        if (retAllocSize <= j + replaceSize) {
          retAllocSize *= 2;
          ret = (char*) realloc(ret, retAllocSize);
        }
     
        else if (element[i] == text[bufferSize]) {
          foundBuffer[bufferSize] = element[i];
          bufferSize++;
     
     
          if (bufferSize == searchSize) {
            bufferSize = 0;
            for (k = 0; k < replaceSize; k++) {
              ret[j++] = replace[k];
            }
          }
        }
     
        else {
          for (k = 0; k < bufferSize; k++) {
            ret[j++] = foundBuffer[k];
          }
          bufferSize = 0;
     
          ret[j++] = element[i];
        }
      }
     
     
      free(foundBuffer);
     
      return ret;
    }
    Merci pour votre aide

  2. #2
    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
    Et ensuite ? Devons-nous faire l'audit de cette fonction pour toi ?

    Si tu considères que la longueur d'un chemin ne peut pas excéder une valeur donnée, tu as le choix de simplement effectuer le remplacement en recopiant les morceaux de chaîne dans un buffer de taille fixe. Tu aurais besoin, par exemple, de strchr et memcpy pour cela. Pour prendre en charge des chaînes d'entrée de longueur arbitraire, il faudrait y ajouter realloc.

    Souviens-toi qu'un backslash correspond au caractère d'échappement en C, il faudra donc le doubler afin d'obtenir la valeur ASCII du caractère proprement dit : '\\'.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Aruba

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Non , je n'attends pas à ce que vous fassiez l'audit .
    La longueur des lignes varie trop . Comment puis-je le doubler ?

  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
    En le tapant deux fois à la suite, comme ci-dessus ?

    As-tu réfléchi à ton algorithme ? Que nous proposes-tu ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Aruba

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Je me suis rendu compte que je n'etais pas clair .

    J'ai un fichier contenant un ensemble de lignes.
    Chaque ligne contient un chemin de fichier .
    Donc la question que je te pose c'est comment faire en reutilisant la fonction que j'ai montre en haut pouvoir remplacer l'antislash par un antislash.
    J'ai essaye de trouver par moi-même mais rien ne marche .

  6. #6
    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
    J'ai sans doute manqué d'intelligibilité moi-même : personne ne fera ce travail à ta place. Nous t'aiderons mais te demandons une forte implication dans le processus d'échange en contrepartie.

    Je t'ai donné quelques indications. Tu nous dois au minimum :

    • la description de l'algorithme que tu comptes utiliser ;
    • un essai d'implémentation en C, ou à défaut un topo précis sur les difficultés rencontrées.


    Soit dit en passant s'il ne s'agit que de répondre au cas d'utilisation - à savoir rechercher et remplacer une sous-chaîne par une autre au sein d'un fichier - alors un script shell fera sans doute bien plus rapidement le travail qu'un programme C.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Aruba

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Merci de ta réponse . Je sais que personne ne fera le travail à ma place . Je ne sais quel algorithme , je dois utiliser pour remplacer un antislash

  8. #8
    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
    Sans doute le même algorithme que pour remplacer n'importe quelle sous-chaîne, quel que soit son contenu. Prends une feuille de papier et un crayon, comment ferais-tu ?

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Aruba

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Ce que je ne comprends pas c'est que ça ne marche pas pour les antislash mais ça marche pour d'autre elements (exemple : les signes < et > marchent correctement) .

  10. #10
    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
    Et comme nous n'avons pas de boule de cristal, nous en revenons donc à l'étape un : qu'as-tu tenté exactement ? Qu'est-ce qui « ne fonctionne pas » ?

  11. #11
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    --
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  12. #12
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Il y a quelque chose dans le backslash qui perturbe. Es-tu bien sûr de vouloir mettre des doubles backslash dans tes noms de fichiers, cela n'a pas de sens, le séparateur de répertoire sous Windows est un simple backslash?
    Mais attention, en C quand on veut écrire une chaîne avec un backslash, on doit en écrire 2. Il n'y en a qu'un au final.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main() {
       char txt[20] = "C:\\toto.txt";  // on écrit 2 \\ pour en avoir 1
       printf("%s longueur %d" , txt , strlen(txt) ); // affiche : C:\toto.txt longueur 11
       scanf("%s" , txt );  // on tape : C:\hello.txt
       printf("%s longueur %d" , txt , strlen(txt) ); // affiche : C:\hello.txt longueur 12
       // si on regarde au debuggeur, on peut avoir : txt = C:\\hello.txt, il n'y a poutant qu'un seul backslash
    }

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Vu que tu ne sembles pas à l'aise avec le langage, dois-tu absolument le faire en C ?
    Sinon en Python ça se fait en quelques lignes et il y a des milliers d'exemples sur le net. Ce genre de manip est inclus dans les bibliothèques standards.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/10/2009, 15h55
  2. [PHP 4] Problème d'apostrophe remplacé par un antislash
    Par bloodstar dans le forum Langage
    Réponses: 6
    Dernier message: 04/10/2009, 16h41
  3. [MySQL] Transformer antislash par des slash
    Par Deciprog dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 23/04/2009, 21h11
  4. explode double antislash
    Par oim dans le forum Langage
    Réponses: 1
    Dernier message: 07/01/2008, 13h33
  5. Réponses: 2
    Dernier message: 12/04/2007, 17h12

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