begin process at 2012 05 29 08:05:16
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

manipulation complexe de chaine de caractère....


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

manipulation complexe de chaine de caractère....

samedi 5 avril 2008 à 11:33:12 | manipulation complexe de chaine de caractère....

Vinsininounet

Bonjours a tous,

j'ai un probleme avec un de mes dévevellopement :

    j'ai une chaine de style :

       doc.txt&doc2.txt&toto.doc&
       dans un char.

       j'ai écrit une fonction, lire ( char * lachaine, int numerodumot );
       par ex :

       si lachaine = doc.txt&doc2.txt&toto.doc&;
       lire(lachaine,2) = "doc2.txt";

       mais, je bloque sur cette fonction que j'ai réécrite entierement plusieurs fois... sans succés ....

      pour ceux qui peuvent m'aider, je vous remerie d'avance, et je vous souhaite un bonne journée ...


samedi 5 avril 2008 à 13:21:54 | Re : manipulation complexe de chaine de caractère....

jfrancois

Réponse acceptée !

Bonjour,

Voila un petit exemple rapide d'extraction de ce type de sous-chaîne de caractère.
 
La sous-chaîne extraite dans la fonction Lire() est stockée dans une chaîne de caractères statique interne à la fonction. C'est beaucoup plus simple comme écriture et comme utilisation que de devoir passer une chaîne supplémentaire à la fonction mais il ne faudra pas utiliser cette fonction plusieurs fois dans la même instruction ! Elle retournerait systématiquement la dernière demande traitée. C'est à dire qu'il ne faut pas faire quelque chose du genre : printf("%s - %s",Lire(lachaine,2),Lire(lachaine,3));
comme dans la fin du programme où l'on voit que les appels de la fonction sont exécutés du dernier vers le premier puisque c'est le résultat du premier appel qui est répété !


#include <stdio.h>


const char* Lire
(
    const char* pszChaine // E:chaîne à examiner du style "xxx&yyy&zzz&"
   ,int         iRang     // E:rang de la sous-chaîne à extraire
)                         // S:sous-chaîne extraite
{
   // --- Sous-chaîne extraite
   const int iLongSousChaine = 100;
   static char szSousChaine[iLongSousChaine];

   // --- Délimiteur de sous-chaînes
   const char delimiteur = '&';


   // --- Pointer le début de la sous-chaîne
   // --- en recherchant le délimiteur précédent
   int i = 0;
   const char* pszDebut = pszChaine;
   while (i < iRang - 1)
   {
      pszDebut = strchr(pszDebut,delimiteur);
      if (pszDebut == NULL)
      {
         // --- Rang maxi dépassé : sous-chaîne inexistante
         // --- On retourne une sous-chaîne vide
         szSousChaine[0] = 0;
         return szSousChaine;
      }
      ++pszDebut; // pour dépasser le délimiteur
      ++i;
   }
  
  
   // --- Pointer la fin de la sous-chaîne
   // --- en recherchant son propre délimiteur
   const char* pszFin = strchr(pszDebut,delimiteur);
   if (pszFin == NULL)
   {
      // --- Rang maxi dépassé : sous-chaîne inexistante
      // --- On retourne une sous-chaîne vide

      szSousChaine[0] = 0;
      return szSousChaine;
   }


   // --- Recopier la sous-chaîne
   int iLongueur = pszFin - pszDebut;
   if (iLongueur >= iLongSousChaine) iLongueur = iLongSousChaine - 1;
   strncpy(szSousChaine,pszDebut,iLongueur);
   szSousChaine[iLongueur] = 0; // terminateur
   return szSousChaine;
}


void main()
{
   char* szLaChaine = "doc.txt&doc2.txt&toto.doc&";

   printf("1 = <%s>\n",Lire(szLaChaine,1));
   printf("2 = <%s>\n",Lire(szLaChaine,2));
   printf("3 = <%s>\n",Lire(szLaChaine,3));
   printf("4 = <%s>\n",Lire(szLaChaine,4));

   // --- Exemple de cas illégal ici
   printf("\n1=%s 2=%s 3=%s 4=%s\n"
         ,Lire(szLaChaine,1)
         ,Lire(szLaChaine,2)
         ,Lire(szLaChaine,3)
         ,Lire(szLaChaine,4));
}

Ce qui donne :

1 = <doc.txt>
2 = <doc2.txt>
3 = <toto.doc>
4 = <> plus de sous-chaîne à extraire

1=doc.txt 2=doc.txt 3=doc.txt 4=doc.txt on récupère 4 fois la première demande !

Jean-François

samedi 5 avril 2008 à 14:26:33 | Re : manipulation complexe de chaine de caractère....

Vinsininounet

Merci beaucoup , c'est exactment cela qu'il me fallai.

merci encore.

petite question, tu crois que

for(i=0;i<...;i++)
lire (str,i);

marcherai ?

bonne journée a tous !
samedi 5 avril 2008 à 15:14:42 | Re : manipulation complexe de chaine de caractère....

jfrancois

Réponse acceptée !

Pas de quoi,

Il n'y a pas de problème pour lire avec une boucle mais :
- en commençant par 1 (le premier rang est 1 et non 0 ici)
- en modifiant la fonction Lire() pour retourner un pointeur NULL quand il n'y a pas (ou plus) de sous-chaîne, c'est plus pratique à utiliser !

#include <stdio.h>

const char* Lire
(
    const char* pszChaine // E:chaîne à examiner du style "xxx&yyy&zzz&"
   ,int         iRang     // E:rang de la sous-chaîne à extraire (à partir de 1)
)                         // S:sous-chaîne extraite ou NULL si aucune
{
   // --- Sous-chaîne extraite
   const int iLongSousChaine = 100;
   static char szSousChaine[iLongSousChaine];

   // --- Délimiteur de sous-chaînes
   const char delimiteur = '&';


   // --- Pointer le début de la sous-chaîne
   // --- en recherchant le délimiteur précédent
   int i = 0;
   const char* pszDebut = pszChaine;
   while (i < iRang - 1)
   {
      pszDebut = strchr(pszDebut,delimiteur);
      if (pszDebut == NULL)
      {
         // --- Rang maxi dépassé : sous-chaîne inexistante
         // --- On retourne un pointeur NULL
         return NULL;
      }
      ++pszDebut; // pour dépasser le délimiteur
      ++i;
   }
  
  
   // --- Pointer la fin de la sous-chaîne
   // --- en recherchant son propre délimiteur
   const char* pszFin = strchr(pszDebut,delimiteur);
   if (pszFin == NULL)
   {
      // --- Rang maxi dépassé : sous-chaîne inexistante
      // --- On retourne un pointeur NULL
      return NULL;
   }


   // --- Recopier la sous-chaîne
   int iLongueur = pszFin - pszDebut;
   if (iLongueur >= iLongSousChaine) iLongueur = iLongSousChaine - 1;
   strncpy(szSousChaine,pszDebut,iLongueur);
   szSousChaine[iLongueur] = 0; // terminateur
   return szSousChaine;
}


void main()
{
   const char* szLaChaine = "doc.txt&doc2.txt&toto.doc&";

   const char* psz;
   for (int i=1 ; psz = Lire(szLaChaine,i) ; ++i)
      printf("%d = <%s>\n",i,psz);
}

Ce qui donne :

1 = <doc.txt>
2 = <doc2.txt>
3 = <toto.doc>

Jean-François

samedi 5 avril 2008 à 16:03:23 | Re : manipulation complexe de chaine de caractère....

Vinsininounet

D'accord, merci encore pour ton aide et bonne journée.
je commencais vraiment a m'arracher les yeux mais la, sa va mieu ...   :D


Cette discussion est classée dans : chaine, txt, doc, doc2, lachaine


Répondre à ce message

Sujets en rapport avec ce message

fichier txt [ par freerider76 ] Bonjour je voudrais savoir comment faire pour changer une chaine de caractere dans un fichier txt, parce là je vois pas; en fait je pars comme ça et i lire un fichier txt ligne par ligne [ par lapinrose67 ] Bonsoir,Je developpe un logiciel en C sous Linux, voila mon problème:Je dois lire un fichier texte ligne par ligne et placer chacune d'entre ellesdans Modification chaine dans exe [ par nohva ] Salut à tous ! Voila mon problème. J'ai une appli qui affiche un ShowMessage : "Salut toi". A partir d'une autre appli j'aimerais modifier ce messa osrstream [ par timy94 ] Bonjour, Après avoir sérialiser une classe en surchargeant l'operateur j'ai ecris, ostrstream  chaine; char * MaTrame_txt; CObjet  * MATrame = new CO Separer une chaine en sous chaine [ par firemax ] Bonjour Je me posais une question , j'aimerais diviser une chaine en sous chaine pour pouvoir ensuite les trier par longueur de chaine de caractere deconcatenation de chaine [ par malouve ] Bonjour, j'ai un fichier txt à traiter en C, ayant plusieurs fichiers, j'entre le chemin du fichier au clavier, je voudrais en sortie, avoir un fich Probleme fichier .txt vers . doc [ par jerem0lim ] Bonjour voilà j'ai un petit problème , je suis étudiant en bts iris et mon projet de fin d'année me demande de crée un fichiers .doc en C++ ,je suis s Conversion d'un .doc en .txt [ par lebcel ] Je voudrais écrire un programme en Langage C qui convertit un fichier .doc en un fichier texte mais je ne sais pas trop comment m'y prendre. Copie d'une chaine Hexa dans une Chaine de caractères [ par lyde ] Bonjour,je souhaiterais copier la chaine hexa "010601AE0205040045" dans une variable de type TCHAR * qui est quasiment equivalente a un char *.Cependa caractere d'échappement dans une chaine [ par lyde ] je souhaite envoyer la chaine"01060AE0205040045" en hexadecimal, donc je l'ai mis sous la forme "\x01\x06\x01\xAE\x02\x05\x04\x00\x45"seulement \x00 e


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales