Accueil > > > CLASSE SSTRING OU LA MANIPULATION DES "STRING" PLUS INTUITIVE
CLASSE SSTRING OU LA MANIPULATION DES "STRING" PLUS INTUITIVE
Information sur la source
Description
cette classe permet de manipuler les string de façon plus intuitive (un peu dans le style de Visual Basic couplé avec certaines possibilités du C++) Ce n'est pas la première et sûrement pas la dernière, elle n'est pas complète non plus, mais elle reprend toutes les fonctions de base qui permettent de manipuler les chaînes de caractères plus facilement. Si je la poste ici, c'est tout simplement parcequ'elle m'a permis de mieux comprendre le fonctionnement des chaînes de caractères en c++ ainsi que la création de son propre type de variable. Cette source est entièrement commentée et permettra (je l'espère) aux débutants de bien comprendre le fonctionnement de ce type de classe ainsi que des diférents éléments qui peuvent la composer (variables, fonctions, opérateurs...) (bon, parfois les commentaires peuvent être assez chaud à comprendre, j'avoue avoir du mal à expliquer certains principes que je comprends intuitivement, mais dans l'ensemble, il n'y a vraiment rien de complexe) le code de la classe sString est visible plus bas. Le zip contient un projet VC++ 6 avec quelques exemples d'utilisation de la classe. ok, voilà pour l'explication, maintenant j'attends vos remarques... cette source m'a permis de comprendre certains méchanismes, maintenant il serait bon d'optimiser... a+ et bon coding !;)
Source
- /***************************************************
- ****************************************************
- ** **
- ** **
- ** entête classe "sString" **
- ** **
- ** Thomas John **
- ** thomas.john@open-design.be **
- ** **
- ** http://www.open-design.be **
- ** **
- ****************************************************
- ***************************************************/
- #include <stdio.h>
- class sString
- {
-
- //##### les données "privées" (variables, fonctions...)
- private:
-
- char * buffer; //le "buffer" qui va contenir la chaîne de caracères
- long len_tmp; //longueur de la chaîne
-
-
- //##### les données publiques
- public:
-
- sString(); //le constructeur par défaut lorsqu'il ne contient rien
- sString(const char a); //le constructeur lorsqu'il contient une donnée de type "char"
- sString(const char * a); //le constructeur lorsqu'il contient un pointeur vers un type de donnée "char"
- ~sString(); //le destructeur
-
- char operator [](int pointeur); //opérateur d'accès
-
- void operator =(const char * a); //opérateur d'assignement d'un pointeur de type "char"
- void operator =(const char &a); //opérateur d'assignement d'un caractère de type "char"
- void operator =(const sString &a); //opérateur d'assignement d'une autre variable de type "sString"
-
- friend sString operator +(const sString a , const sString b); //opérateur de concaténation
- void operator +=(const sString a); //opérateur de concaténation (ajoute une chaîne juste après celle-ci)
-
- //operator char(); //opérateur de convertion vers un type de donnée "char"
- operator char*(); //opérateur de convertion vers un pointeur de type "char"
- operator char*() const; //opérateur de convertion vers un pointeur de type "char"
-
- long Len(); //retourne la longueur de la chaîne
- int to_Int(); //converti la valeur du buffer en int
-
-
- };
-
-
-
- //###########################
- //##### #####
- //##### CONSTRUCTEURS #####
- //##### #####
-
- //constructeur par défaut
- sString::sString()
- {
-
- //on alloue un buffer de taille 1
- buffer = new char[1];
-
- //on spécifie la taille de cette chaîne
- len_tmp = 0;
-
- //on insère le caractère null qui spécifie la fin de la chaîne de caractères
- buffer[0] = '\0';
-
- }
-
- //constructeur lorsqu'il contient une donnée de type "char"
- sString::sString(const char a)
- {
-
- //on alloue un buffer de taille 2
- buffer = new char[2];
-
- //on spécifie la taille de cette chaîne
- len_tmp = 1;
-
- //on place le caractère qui a été spécifié en tant que "a"
- buffer[0] = a;
-
- //on insère le caractère null qui spécifie la fin de la chaîne de caractères
- buffer[1] = '\0';
-
- }
-
- //constructeur lorsqu'il contient un pointeur vers un type de donnée "char"
- sString::sString(const char * a)
- {
-
- int i = 0;
-
- //taille de la chaîne de caractères donnée en argument
- len_tmp = 0;
-
- //on incrémente notre pointeur "a" (ainsi que "len_tmp") jusqu'à ce qu'il arrive à la fin, de ce fait "len_tmp"
- //est égale à la taille de la chaîne de caractères vers laquelle pointe notre pointeur "a"
- while(*a)
- {
- a++;
- len_tmp++;
- }
-
- //on remet notre pointeur à zéro
- a -= len_tmp;
-
- //la taille de notre buffer équivaut à celle de la chaîne de caractères donnée en argument (+ 1 pour le caractère null)
- buffer = new char[len_tmp + 1];
-
- //on copie la chaîne "a" vers le buffer
- for (i=0; i < len_tmp ; i++)
- buffer[i] = a[i];
-
- //on place le caractère de fin (null)
- buffer[len_tmp] = '\0';
-
- }
-
- //###########################
- //##### #####
- //##### DESTRUCTEUR #####
- //##### #####
-
- //destructeur par défaut
- sString::~sString()
- {
- //delete [] buffer;
- }
-
- //###########################
- //##### #####
- //##### FONCTIONS #####
- //##### #####
-
- //retourne la longeur de la chaîne
- long sString::Len()
- {
-
- return len_tmp;
-
- }
-
- //converti la valeur du buffer en int
- int sString::to_Int()
- {
-
- int tmp_int=0; //la variable temporaire qui va contenir la valeur de la variable à convertir
- int i; //variable d'incrémentation
- int i2; //variable d'incrémentation
- int i3; //variable d'incrémentation
- int multi_sz; //multiplicateur
-
-
- for(i2=0 , i=len_tmp-1 ; i>=0 ; i-- , i2++)
- {
-
- //on remet à 1 notre multiplicateur
- multi_sz = 1;
-
- //on calcule le multiplicateur
- for(i3=0 ; i3<i2 ; i3++)
- multi_sz *= 10;
-
- //méthode plus rapide, le problème est que si les caractères ne sont pas des chiffres, il peut se produire une erreur
- if( int(buffer[i]) == 45 )
- {
- tmp_int = -tmp_int;
- return tmp_int; //on retourne la valeur directement car le signe "-" se trouve toujours à la fin
- }
-
- tmp_int += ( int(buffer[i]) - 48 ) * multi_sz;
-
- /* méthode moins rapide mais plus simple à comprendre et surtout évite certaines erreurs
- switch( int(buffer[i]) )
- {
-
- case 45: //signe -
- tmp_int = -tmp_int;
- return tmp_int; //on retourne la valeur directement car le signe "-" se trouve toujours à la fin
-
- case 49: //1
- tmp_int += 1 * multi_sz;
- break;
-
- case 50: //2
- tmp_int += 2 * multi_sz;
- break;
-
- case 51: //3
- tmp_int += 3 * multi_sz;
- break;
-
- case 52: //4
- tmp_int += 4 * multi_sz;
- break;
-
- case 53: //5
- tmp_int += 5 * multi_sz;
- break;
-
- case 54: //6
- tmp_int += 6 * multi_sz;
- break;
-
- case 55: //7
- tmp_int += 7 * multi_sz;
- break;
-
- case 56: //8
- tmp_int += 8 * multi_sz;
- break;
-
- case 57: //9
- tmp_int += 9 * multi_sz;
- break;
-
- }
- */
-
- }
-
- return tmp_int;
-
- }
-
- //###########################
- //##### #####
- //##### OPERATEURS #####
- //##### #####
-
- //opérateur d'accès
- char sString::operator [](int pointeur)
- {
- //on retourne le caractère pointé par "pointeur" dans "buffer"
- return buffer[pointeur];
-
- }
-
- //opérateur d'assignement d'un pointeur de type "char" (ex: sString c = "toto";)
- void sString::operator =(const char * a)
- {
-
- int i = 0;
-
- //taille de la chaîne de caractères donnée en argument
- len_tmp = 0;
-
- while(*a)
- {
- a++;
- len_tmp++;
- }
-
- //on remet notre pointeur à zéro
- a -= len_tmp;
-
- //on supprime les données contenues dans le "buffer"
- delete [] buffer;
-
- //on alloue un buffer de la taille de la chaîne de caractères donnée en argument + 1 pour le caractère null
- buffer = new char[len_tmp + 1];
-
- //on copie la chaîne "a" vers le buffer
- for (i=0; i < len_tmp ; i++)
- buffer[i] = a[i];
-
- //on place le caractère de fin (null)
- buffer[len_tmp] = '\0';
-
- }
-
- //opérateur d'assignement d'un caractère de type "char"
- void sString::operator =(const char &a)
- {
-
- //on supprime les données contenues dans le "buffer"
- delete [] buffer;
-
- //on alloue un buffer de taille 2
- buffer = new char[2];
-
- //on spécifie la taille de cette chaîne
- len_tmp = 1;
-
- //on place le caractère qui a été spécifié en tant que "a"
- buffer[0] = a;
-
- //on insère le caractère null qui spécifie la fin de la chaîne de caractères
- buffer[1] = '\0';
- }
-
- //opérateur d'assignement d'une autre variable de type "sString" (ex: sString c,d; c = d;)
- void sString::operator =(const sString &a)
- {
- //taille de la chaîne de caractères donnée en argument
- len_tmp = a.len_tmp;
-
- //on supprime les données contenues dans le "buffer"
- delete [] buffer;
-
- //on copie les donées dans le buffer
- buffer = a.buffer;
-
- }
-
- //opérateur de concaténation
- sString operator +(const sString a , const sString b)
- {
-
- /*
- int i = 0 , i2 = 0;
- long len_sz = 0;
-
- //taille des deux chaînes additionnées
- len_sz = a.len_tmp + b.len_tmp;
-
- //on crée une nouvelle chaîne temporaire de type "sString" et de longueur len_sz + 1 (pour le caractère null)
- sString Resultat;
- if(Resultat.buffer)
- delete[] Resultat.buffer;
- Resultat.buffer = new char[len_sz + 1];
-
- //on copie la chaîne "a" vers le buffer
- for (i=0; i < a.len_tmp ; i++)
- Resultat.buffer[i] = a.buffer[i];
-
- //ensuite on copie la chaîne "b" à la suite
- for (i2=0 ; i < len_sz ; i++ , i2++)
- Resultat.buffer[i] = b.buffer[i2];
-
- //on place le caractère de fin (null)
- Resultat.buffer[len_sz] = '\0';
-
- //on retourne la chaîne
- return Resultat;
- */
-
- int i = 0 , i2 = 0;
- long len_sz = 0;
- char * buffer_sz;
-
- //taille des deux chaînes additionnées
- len_sz = a.len_tmp + b.len_tmp;
-
- //on alloue un buffer de la taille des deux chaînes aditionnées
- buffer_sz = new char[len_sz + 1];
-
- //on copie la chaîne "a" vers le buffer
- for (i=0; i < a.len_tmp ; i++)
- buffer_sz[i] = a.buffer[i];
-
- //ensuite on copie la chaîne "b" à la suite
- for (i2=0 ; i < len_sz ; i++)
- {
- buffer_sz[i] = b.buffer[i2];
- i2++;
- }
-
- //on place le caractère de fin (null)
- buffer_sz[len_sz] = '\0';
-
- //on crée une nouvelle chaîne temporaire de type "sString"
- sString Resultat = buffer_sz;
-
- //on libère la mémoire
- delete [] buffer_sz;
-
- //on retourne la chaîne
- return Resultat;
-
-
- }
-
- //opérateur de concaténation, il permet d'ajouter une chaîne directement après celle-ci
- void sString::operator +=(const sString a)
- {
-
- int i = 0 , i2 = 0;
- long len_sz = 0;
- char * buffer_sz = new char[len_tmp];
-
- //taille des deux chaînes additionnées
- len_sz = len_tmp + a.len_tmp;
-
- //on copie le buffer de la variable "locale" (pas celui de "a")
- for (i=0; i <= len_tmp ; i++)
- buffer_sz[i] = buffer[i];
-
- //on supprime les données contenues dans le "buffer"
- delete [] buffer;
-
- //on défini la taille du buffer
- buffer = new char[len_sz + 1];
-
- //on copie la chaîne "a" vers le buffer
- for (i=0; i < len_tmp ; i++)
- buffer[i] = buffer_sz[i];
-
- //ensuite on copie la chaîne "b" à la suite
- for (i2=0 ; i < len_sz ; i++)
- {
- buffer[i] = a.buffer[i2];
- i2++;
- }
-
- //on place le caractère de fin (null)
- buffer[len_sz] = '\0';
-
- //on spécifie la taille de la nouvelle chaîne
- len_tmp = len_sz;
-
- }
- /*
- //opérateur de convertion vers un type de donnée "char"
- sString::operator char()
- {
-
- return buffer[0];
-
- }
- */
- //opérateur de convertion vers un pointeur de type "char"
- sString::operator char*()
- {
-
- return buffer;
-
- }
-
- //opérateur de convertion vers un pointeur de type "char"
- sString::operator char*() const
- {
-
- return buffer;
-
- }
-
- //###########################
- //##### #####
- //##### FONCTIONS #####
- //##### INDEPENDANTES #####
- //##### DE LA CLASSE #####
- //##### #####
-
- //les fonctions prennant comme arguments des variables de type "sString" ont été supprimées étant donné
- //que le type "sString" fait automatiquement la conversion en "*char" lorsque nécessaire
-
- //char * sLeft(sString a , int longueur_sz); //renvoie les "n" premiers caractères d'une chaîne
- char* sLeft(char * a , int longueur_sz); //renvoie les "n" premiers caractères d'une chaîne
-
- //char* sRight(sString a , int longueur_sz); //renvoie les "n" derniers caractères d'une chaîne (rem: voir sLeft)
- char* sRight(char * a , int longueur_sz); //renvoie les "n" derniers caractères d'une chaîne
-
- //char* sMid(sString a , int depart_sz , int longueur_sz); //renvoie une chaîne de longueur "longueur_sz" commençant au caractère déterminé par "depart_sz" (rem: voir sLeft)
- char* sMid(char * a , int depart_sz , int longueur_sz); //renvoie une chaîne de longueur "longueur_sz" commençant au caractère déterminé par "depart_sz"
-
- //bool sCompare(sString a , sString b); //compare les deux chaînes de caractères "a" et "b" et renvoie "true" si elles concordent
- bool sCompare(char * a , char * b); //compare les deux chaînes de caractères "a" et "b" et renvoie "true" si elles concordent
-
- //int sStrPos(sString a , sString b , int depart_sz); //renvoie la position du premier caractère de "b" trouvé dans "a"
- int sStrPos(char * a , char * b , int depart_sz); //renvoie la position du premier caractère de "b" trouvé dans "a"
-
- //char** sSplit(sString a , sString b , int limite_sz); //découpe la chaîne "a" en plusieurs morceaux séparés par "b", "limite_sz" est le nombre de morceaux max à retourner (-1 = max)
- /*
- //renvoie les "n" premiers caractères d'une chaîne
- char * sLeft(sString a , int longueur_sz)
- {
-
- //on vérifie si la longueur spécifiée est supérieur à zéro
- if( longueur_sz <= 0 )
- return ""; //non, on ne retourne rien
-
- int i = 0;
-
- //on vérifie si la longueur demandée n'est pas supérieure ou égale à celle de la chaîne "a"
- if( longueur_sz >= a.Len() )
- return a; //oui, on retourne la chaîne telle qu'elle était
-
- //on alloue un buffer de la taille de la chaîne de caractères donnée en argument + 1 pour le caractère null
- char * buffer_tmp = new char[longueur_sz + 1];
-
- //variable qui va contenir la chaîne de caractères de "a"
- char * tmp_a = a;
-
- //on copie la chaîne "a" vers le buffer
- for (i=0; i < longueur_sz ; i++)
- buffer_tmp[i] = tmp_a[i];
-
- //on place le caractère de fin (null)
- buffer_tmp[longueur_sz] = '\0';
-
- //et on retourne le résultat final
- return buffer_tmp;
-
- }
- */
- //renvoie les "n" premiers caractères d'une chaîne
- char * sLeft(char * a , int longueur_sz)
- {
-
- //on vérifie si la longueur spécifiée est supérieur à zéro
- if( longueur_sz <= 0 )
- return ""; //non, on ne retourne rien
-
- int i = 0;
-
- //taille de la chaîne de caractères donnée en argument ("a")
- int len_tmp = 0;
-
- while(*a)
- {
- a++;
- len_tmp++;
- }
-
- //on remet notre pointeur à zéro
- a -= len_tmp;
-
- //on vérifie si la longueur demandée n'est pas supérieure ou égale à celle de la chaîne "a"
- if( longueur_sz >= len_tmp )
- return a; //oui, on retourne la chaîne telle qu'elle était
-
- //on alloue un buffer de la taille de la chaîne de caractères donnée en argument + 1 pour le caractère null
- char * buffer_tmp = new char[longueur_sz + 1];
-
- //on copie la chaîne "a" vers le buffer
- for (i=0; i < longueur_sz ; i++)
- buffer_tmp[i] = a[i];
-
- //on place le caractère de fin (null)
- buffer_tmp[longueur_sz] = '\0';
-
- //et on retourne le résultat final
- return buffer_tmp;
-
- }
- /*
- //renvoie les "n" derniers caractères d'une chaîne
- char * sRight(sString a , int longueur_sz)
- {
-
- //on vérifie si la longueur spécifiée est supérieur à zéro
- if( longueur_sz <= 0 )
- return ""; //non, on ne retourne rien
-
- int i = 0 , i2 = 0;
-
- //on vérifie si la longueur demandée n'est pas supérieure ou égale à celle de la chaîne "a"
- if( longueur_sz >= a.Len() )
- return a; //oui, on retourne la chaîne telle qu'elle était
-
- //on alloue un buffer de la taille de la chaîne de caractères donnée en argument + 1 pour le caractère null
- char * buffer_tmp = new char[longueur_sz + 1];
-
- //variable qui va contenir la chaîne de caractères de "a"
- char * tmp_a = a;
-
- //on copie la chaîne "a" vers le buffer
- for (i=(a.Len() - longueur_sz) ; i < a.Len() ; i++)
- {
- buffer_tmp[i2] = tmp_a[i];
- i2++;
- }
-
- //on place le caractère de fin (null)
- buffer_tmp[longueur_sz] = '\0';
-
- //et on retourne le résultat final
- return buffer_tmp;
-
- }
- */
- //renvoie les "n" derniers caractères d'une chaîne
- char * sRight(char * a , int longueur_sz)
- {
-
- //on vérifie si la longueur spécifiée est supérieur à zéro
- if( longueur_sz <= 0 )
- return ""; //non, on ne retourne rien
-
- int i = 0 , i2 = 0;
-
- //taille de la chaîne de caractères donnée en argument ("a")
- int len_tmp = 0;
-
- while(*a)
- {
- a++;
- len_tmp++;
- }
-
- //on remet notre pointeur à zéro
- a -= len_tmp;
-
- //on vérifie si la longueur demandée n'est pas supérieure ou égale à celle de la chaîne "a"
- if( longueur_sz >= len_tmp )
- return a; //oui, on retourne la chaîne telle qu'elle était
-
- //on alloue un buffer de la taille de la chaîne de caractères donnée en argument + 1 pour le caractère null
- char * buffer_tmp = new char[longueur_sz + 1];
-
- //on copie la chaîne "a" vers le buffer
- for (i=(len_tmp - longueur_sz) ; i < len_tmp ; i++)
- {
- buffer_tmp[i2] = a[i];
- i2++;
- }
-
- //on place le caractère de fin (null)
- buffer_tmp[longueur_sz] = '\0';
-
- //et on retourne le résultat final
- return buffer_tmp;
-
- }
-
- //renvoie une chaîne de longueur "longueur_sz" commençant au caractère déterminé par "depart_sz"
- char * sMid(sString a , int depart_sz , int longueur_sz)
- {
-
- int i = 0 , i2 = 0;
-
- //on vérifie si on ne dépasse pas la taille de la chaîne
- if( (depart_sz + longueur_sz + 1) > a.Len() )
- longueur_sz = a.Len() - depart_sz; //on respécifie la longueur de la chaîne à retourner
-
- //on vérifie si la longueur de la chaîne est supérieur à zéro
- if( longueur_sz < 0 )
- return ""; //non, on ne retourne rien
-
- //on alloue un buffer de la taille de la chaîne de caractères donnée en argument + 1 pour le caractère null
- char * buffer_tmp = new char[longueur_sz + 1];
-
- //variable qui va contenir la chaîne de caractères de "a"
- char * tmp_a = a;
-
- //on copie la chaîne "a" vers le buffer
- for (i=(depart_sz) ; i < (depart_sz + longueur_sz) ; i++)
- {
- buffer_tmp[i2] = tmp_a[i];
- i2++;
- }
-
- //on place le caractère de fin (null)
- buffer_tmp[longueur_sz] = '\0';
-
- //et on retourne le résultat final
- return buffer_tmp;
-
- }
-
- //renvoie une chaîne de longueur "longueur_sz" commençant au caractère déterminé par "depart_sz"
- char * sMid(char * a , int depart_sz , int longueur_sz)
- {
-
- int i = 0 , i2 = 0;
-
- //taille de la chaîne de caractères donnée en argument ("a")
- int len_tmp = 0;
-
- while(*a)
- {
- a++;
- len_tmp++;
- }
-
- //on remet notre pointeur à zéro
- a -= len_tmp;
-
- //on vérifie si on ne dépasse pas la taille de la chaîne
- if( (depart_sz + longueur_sz + 1) > len_tmp )
- longueur_sz = len_tmp - depart_sz; //on respécifie la longueur de la chaîne à retourner
-
- //on vérifie si la longueur de la chaîne est supérieur à zéro
- if( longueur_sz < 0 )
- return ""; //non, on ne retourne rien
-
- //on alloue un buffer de la taille de la chaîne de caractères donnée en argument + 1 pour le caractère null
- char * buffer_tmp = new char[longueur_sz + 1];
-
- //on copie la chaîne "a" vers le buffer
- for (i=(depart_sz) ; i < (depart_sz + longueur_sz) ; i++)
- {
- buffer_tmp[i2] = a[i];
- i2++;
- }
-
- //on place le caractère de fin (null)
- buffer_tmp[longueur_sz] = '\0';
-
- //et on retourne le résultat final
- return buffer_tmp;
-
- }
- /*
- //compare les deux chaînes de caractères "a" et "b" et renvoie "true" si elles concordent
- bool sCompare(sString a , sString b)
- {
-
- //on vérifie d'abords si la longueur des deux chaîne est la même
- if( a.Len() != b.Len() )
- return false;
-
- //on récupère sous forme "char" "a" et "b"
- char * tmp_a = new char[a.Len()] = a;
- char * tmp_b = new char[b.Len()] = b;
-
- //on compare chaque caractère correspondant
- for( int i=0 ; i<=a.Len() ; i++ )
- {
-
- if(tmp_a[i] != tmp_b[i])
- return false;
-
- }
-
- //si on arrive jusqu'ici, c'est que les deux chaînes sont identiques
- return true;
-
- }
- */
- //compare les deux chaînes de caractères "a" et "b" et renvoie "true" si elles concordent
- bool sCompare(char * a , char * b)
- {
-
- //taille de la chaîne de caractères donnée en argument ("a")
- int len_a = 0;
-
- while(*a)
- {
- a++;
- len_a++;
- }
-
- //on remet notre pointeur à zéro
- a -= len_a;
-
- //taille de la chaîne de caractères donnée en argument ("b")
- int len_b = 0;
-
- while(*b)
- {
- b++;
- len_b++;
- }
-
- //on remet notre pointeur à zéro
- b -= len_b;
-
- //on vérifie d'abords si la longueur des deux chaîne est la même
- if( len_a != len_b )
- return false;
-
- //on compare chaque caractère correspondant
- for( int i=0 ; i<=len_a ; i++ )
- {
-
- if(a[i] != b[i])
- return false;
-
- }
-
- //si on arrive jusqu'ici, c'est que les deux chaînes sont identiques
- return true;
-
- }
- /*
- //renvoie la position du premier caractère de la chaîne "b" trouvée dans "a"
- int sStrPos(sString a , sString b , int depart_sz = 0)
- {
-
- //on vérifie si la taille de la chaîne à chercher n'est pas plus grande que la chaîne dans laquelle il faut chercher
- if( (b.Len() + depart_sz) > a.Len() )
- return -1;
-
- //on calcule le nombre d'itérations à effectuer
- int iterations_sz = a.Len() - (b.Len() + depart_sz);
-
- //on fait une boucle
- for(int i=depart_sz ; i <= iterations_sz ; i++ )
- {
-
- //on vérifie si la chaîne de caractères (dans "b") de même taille que "a" et commençant au caractère "i" n'est pas = à "a"
- if( sCompare(sMid(a , i , b.Len()) , b) )
- return i;
-
- }
-
- //si on arrive ici, c'est qu'on a rien trouvé
- return -1;
-
- }
- */
- //renvoie la position du premier caractère de la chaîne "b" trouvée dans "a"
- int sStrPos(char * a , char * b , int depart_sz = 0)
- {
-
- int i2=0;
-
- //taille de la chaîne de caractères donnée en argument ("a")
- int len_a = 0;
-
- while(*a)
- {
- a++;
- len_a++;
- }
-
- //on remet notre pointeur à zéro
- a -= len_a;
-
- //taille de la chaîne de caractères donnée en argument ("b")
- int len_b = 0;
-
- while(*b)
- {
- b++;
- len_b++;
- }
-
- //on remet notre pointeur à zéro
- b -= len_b;
-
- //on vérifie si la taille de la chaîne à chercher n'est pas plus grande que la chaîne dans laquelle il faut chercher
- if( (len_b + depart_sz) > len_a )
- return -1;
-
- //on calcule le nombre d'itérations à effectuer
- int iterations_sz = len_a - (len_b + depart_sz);
-
- //on fait une boucle
- for(int i=depart_sz ; i2 <= iterations_sz ; i++ )
- {
-
- //on vérifie si la chaîne de caractères (dans "b") de même taille que "a" et commençant au caractère "i" n'est pas = à "a"
- if( sCompare(sMid(a , i ,len_b) , b) )
- return i;
-
- i2++;
-
- }
-
- //si on arrive ici, c'est qu'on a rien trouvé
- return -1;
-
- }
-
-
- //découpe la chaîne "a" en plusieurs morceaux séparés par "b", "limite_sz" est le nombre de morceaux max à retourner (-1 = max)
- sString * sSplit(char * a , char * b , int limite_sz , int &taille_finale)
- {
-
- int i=0 , pos=-1 , pos2=0 ;
- sString * tmp_res;
-
- //taille de la chaîne de caractères donnée en argument ("a")
- int len_a = 0;
-
- while(*a)
- {
- a++;
- len_a++;
- }
-
- //on remet notre pointeur à zéro
- a -= len_a;
-
- //taille de la chaîne de caractères donnée en argument ("b")
- int len_b = 0;
-
- while(*b)
- {
- b++;
- len_b++;
- }
-
- //on remet notre pointeur à zéro
- b -= len_b;
-
- //on parcourt la chaîne "a" à la recherche de "b" autant de fois que "b" s'y trouve
- do
- {
- pos = sStrPos(a , b , pos + 1);
- i++;
-
- }while(pos > 0);
-
- //si la limite est à zéro on renvoie un tableau avec une seule valeur
- if(limite_sz == 0)
- {
- //on quitte ici
- tmp_res = new sString[0];
- tmp_res[0] = "";
- return tmp_res;
-
- //si une limite est spécifiée, on vérifie s'il faut en tenir compte
- }else if(limite_sz > 0){
-
- if(i > limite_sz)
- {
- i = limite_sz;
- }
-
- }
-
- //on spécifie le nombre de résultats que le tableau va contenir
- taille_finale = i;
-
- //on crée un tableau de type "sString" de la taille indiquée par "i"
- tmp_res = new sString[i];
-
- //on décrémente i
- i--;
-
- //on remet la position de départ à -1 (on y ajoute 1 par la suite à chaque itérations de la boucle for)
- pos = -1;
-
- //pos2 commence lui à zéro et va prendre la valeur de pos avant que celui-ci ne change
- pos2 = 0;
-
- for(int i2=0 ; i2<i ; i2++ )
- {
-
- //on récupère la position de la première occurence de la chaîne "b" dans la chaîne "a"
- pos = sStrPos(a , b , pos + 1);
-
- //on récupère la chaîne de caractères située entre "pos2" et "pos" et on la place dans notre tableau
- tmp_res[i2] = sMid(a , pos2 , pos-pos2);
-
- pos2 = pos + len_b;
-
- }
-
- //on récupère la fin de la chaîne
- tmp_res[i2] = sMid(a , pos2 , len_a-pos2);
-
- return tmp_res;
-
- }
/***************************************************
****************************************************
** **
** **
** entête classe "sString" **
** **
** Thomas John **
** thomas.john@open-design.be **
** **
** http://www.open-design.be **
** **
****************************************************
***************************************************/
#include <stdio.h>
class sString
{
//##### les données "privées" (variables, fonctions...)
private:
char * buffer; //le "buffer" qui va contenir la chaîne de caracères
long len_tmp; //longueur de la chaîne
//##### les données publiques
public:
sString(); //le constructeur par défaut lorsqu'il ne contient rien
sString(const char a); //le constructeur lorsqu'il contient une donnée de type "char"
sString(const char * a); //le constructeur lorsqu'il contient un pointeur vers un type de donnée "char"
~sString(); //le destructeur
char operator [](int pointeur); //opérateur d'accès
void operator =(const char * a); //opérateur d'assignement d'un pointeur de type "char"
void operator =(const char &a); //opérateur d'assignement d'un caractère de type "char"
void operator =(const sString &a); //opérateur d'assignement d'une autre variable de type "sString"
friend sString operator +(const sString a , const sString b); //opérateur de concaténation
void operator +=(const sString a); //opérateur de concaténation (ajoute une chaîne juste après celle-ci)
//operator char(); //opérateur de convertion vers un type de donnée "char"
operator char*(); //opérateur de convertion vers un pointeur de type "char"
operator char*() const; //opérateur de convertion vers un pointeur de type "char"
long Len(); //retourne la longueur de la chaîne
int to_Int(); //converti la valeur du buffer en int
};
//###########################
//##### #####
//##### CONSTRUCTEURS #####
//##### #####
//constructeur par défaut
sString::sString()
{
//on alloue un buffer de taille 1
buffer = new char[1];
//on spécifie la taille de cette chaîne
len_tmp = 0;
//on insère le caractère null qui spécifie la fin de la chaîne de caractères
buffer[0] = '\0';
}
//constructeur lorsqu'il contient une donnée de type "char"
sString::sString(const char a)
{
//on alloue un buffer de taille 2
buffer = new char[2];
//on spécifie la taille de cette chaîne
len_tmp = 1;
//on place le caractère qui a été spécifié en tant que "a"
buffer[0] = a;
//on insère le caractère null qui spécifie la fin de la chaîne de caractères
buffer[1] = '\0';
}
//constructeur lorsqu'il contient un pointeur vers un type de donnée "char"
sString::sString(const char * a)
{
int i = 0;
//taille de la chaîne de caractères donnée en argument
len_tmp = 0;
//on incrémente notre pointeur "a" (ainsi que "len_tmp") jusqu'à ce qu'il arrive à la fin, de ce fait "len_tmp"
//est égale à la taille de la chaîne de caractères vers laquelle pointe notre pointeur "a"
while(*a)
{
a++;
len_tmp++;
}
//on remet notre pointeur à zéro
a -= len_tmp;
//la taille de notre buffer équivaut à celle de la chaîne de caractères donnée en argument (+ 1 pour le caractère null)
buffer = new char[len_tmp + 1];
//on copie la chaîne "a" vers le buffer
for (i=0; i < len_tmp ; i++)
buffer[i] = a[i];
//on place le caractère de fin (null)
buffer[len_tmp] = '\0';
}
//###########################
//##### #####
//##### DESTRUCTEUR #####
//##### #####
//destructeur par défaut
sString::~sString()
{
//delete [] buffer;
}
//###########################
//##### #####
//##### FONCTIONS #####
//##### #####
//retourne la longeur de la chaîne
long sString::Len()
{
return len_tmp;
}
//converti la valeur du buffer en int
int sString::to_Int()
{
int tmp_int=0; //la variable temporaire qui va contenir la valeur de la variable à convertir
int i; //variable d'incrémentation
int i2; //variable d'incrémentation
int i3; //variable d'incrémentation
int multi_sz; //multiplicateur
for(i2=0 , i=len_tmp-1 ; i>=0 ; i-- , i2++)
{
//on remet à 1 notre multiplicateur
multi_sz = 1;
//on calcule le multiplicateur
for(i3=0 ; i3<i2 ; i3++)
multi_sz *= 10;
//méthode plus rapide, le problème est que si les caractères ne sont pas des chiffres, il peut se produire une erreur
if( int(buffer[i]) == 45 )
{
tmp_int = -tmp_int;
return tmp_int; //on retourne la valeur directement car le signe "-" se trouve toujours à la fin
}
tmp_int += ( int(buffer[i]) - 48 ) * multi_sz;
/* méthode moins rapide mais plus simple à comprendre et surtout évite certaines erreurs
switch( int(buffer[i]) )
{
case 45: //signe -
tmp_int = -tmp_int;
return tmp_int; //on retourne la valeur directement car le signe "-" se trouve toujours à la fin
case 49: //1
tmp_int += 1 * multi_sz;
break;
case 50: //2
tmp_int += 2 * multi_sz;
break;
case 51: //3
tmp_int += 3 * multi_sz;
break;
case 52: //4
tmp_int += 4 * multi_sz;
break;
case 53: //5
tmp_int += 5 * multi_sz;
break;
case 54: //6
tmp_int += 6 * multi_sz;
break;
case 55: //7
tmp_int += 7 * multi_sz;
break;
case 56: //8
tmp_int += 8 * multi_sz;
break;
case 57: //9
tmp_int += 9 * multi_sz;
break;
}
*/
}
return tmp_int;
}
//###########################
//##### #####
//##### OPERATEURS #####
//##### #####
//opérateur d'accès
char sString::operator [](int pointeur)
{
//on retourne le caractère pointé par "pointeur" dans "buffer"
return buffer[pointeur];
}
//opérateur d'assignement d'un pointeur de type "char" (ex: sString c = "toto";)
void sString::operator =(const char * a)
{
int i = 0;
//taille de la chaîne de caractères donnée en argument
len_tmp = 0;
while(*a)
{
a++;
len_tmp++;
}
//on remet notre pointeur à zéro
a -= len_tmp;
//on supprime les données contenues dans le "buffer"
delete [] buffer;
//on alloue un buffer de la taille de la chaîne de caractères donnée en argument + 1 pour le caractère null
buffer = new char[len_tmp + 1];
//on copie la chaîne "a" vers le buffer
for (i=0; i < len_tmp ; i++)
buffer[i] = a[i];
//on place le caractère de fin (null)
buffer[len_tmp] = '\0';
}
//opérateur d'assignement d'un caractère de type "char"
void sString::operator =(const char &a)
{
//on supprime les données contenues dans le "buffer"
delete [] buffer;
//on alloue un buffer de taille 2
buffer = new char[2];
//on spécifie la taille de cette chaîne
len_tmp = 1;
//on place le caractère qui a été spécifié en tant que "a"
buffer[0] = a;
//on insère le caractère null qui spécifie la fin de la chaîne de caractères
buffer[1] = '\0';
}
//opérateur d'assignement d'une autre variable de type "sString" (ex: sString c,d; c = d;)
void sString::operator =(const sString &a)
{
//taille de la chaîne de caractères donnée en argument
len_tmp = a.len_tmp;
//on supprime les données contenues dans le "buffer"
delete [] buffer;
//on copie les donées dans le buffer
buffer = a.buffer;
}
//opérateur de concaténation
sString operator +(const sString a , const sString b)
{
/*
int i = 0 , i2 = 0;
long len_sz = 0;
//taille des deux chaînes additionnées
len_sz = a.len_tmp + b.len_tmp;
//on crée une nouvelle chaîne temporaire de type "sString" et de longueur len_sz + 1 (pour le caractère null)
sString Resultat;
if(Resultat.buffer)
delete[] Resultat.buffer;
Resultat.buffer = new char[len_sz + 1];
//on copie la chaîne "a" vers le buffer
for (i=0; i < a.len_tmp ; i++)
Resultat.buffer[i] = a.buffer[i];
//ensuite on copie la chaîne "b" à la suite
for (i2=0 ; i < len_sz ; i++ , i2++)
Resultat.buffer[i] = b.buffer[i2];
//on place le caractère de fin (null)
Resultat.buffer[len_sz] = '\0';
//on retourne la chaîne
return Resultat;
*/
int i = 0 , i2 = 0;
long len_sz = 0;
char * buffer_sz;
//taille des deux chaînes additionnées
len_sz = a.len_tmp + b.len_tmp;
//on alloue un buffer de la taille des deux chaînes aditionnées
buffer_sz = new char[len_sz + 1];
//on copie la chaîne "a" vers le buffer
for (i=0; i < a.len_tmp ; i++)
buffer_sz[i] = a.buffer[i];
//ensuite on copie la chaîne "b" à la suite
for (i2=0 ; i < len_sz ; i++)
{
buffer_sz[i] = b.buffer[i2];
i2++;
}
//on place le caractère de fin (null)
buffer_sz[len_sz] = '\0';
//on crée une nouvelle chaîne temporaire de type "sString"
sString Resultat = buffer_sz;
//on libère la mémoire
delete [] buffer_sz;
//on retourne la chaîne
return Resultat;
}
//opérateur de concaténation, il permet d'ajouter une chaîne directement après celle-ci
void sString::operator +=(const sString a)
{
int i = 0 , i2 = 0;
long len_sz = 0;
char * buffer_sz = new char[len_tmp];
//taille des deux chaînes additionnées
len_sz = len_tmp + a.len_tmp;
//on copie le buffer de la variable "locale" (pas celui de "a")
for (i=0; i <= len_tmp ; i++)
buffer_sz[i] = buffer[i];
//on supprime les données contenues dans le "buffer"
delete [] buffer;
//on défini la taille du buffer
buffer = new char[len_sz + 1];
//on copie la chaîne "a" vers le buffer
for (i=0; i < len_tmp ; i++)
buffer[i] = buffer_sz[i];
//ensuite on copie la chaîne "b" à la suite
for (i2=0 ; i < len_sz ; i++)
{
buffer[i] = a.buffer[i2];
i2++;
}
//on place le caractère de fin (null)
buffer[len_sz] = '\0';
//on spécifie la taille de la nouvelle chaîne
len_tmp = len_sz;
}
/*
//opérateur de convertion vers un type de donnée "char"
sString::operator char()
{
return buffer[0];
}
*/
//opérateur de convertion vers un pointeur de type "char"
sString::operator char*()
{
return buffer;
}
//opérateur de convertion vers un pointeur de type "char"
sString::operator char*() const
{
return buffer;
}
//###########################
//##### #####
//##### FONCTIONS #####
//##### INDEPENDANTES #####
//##### DE LA CLASSE #####
//##### #####
//les fonctions prennant comme arguments des variables de type "sString" ont été supprimées étant donné
//que le type "sString" fait automatiquement la conversion en "*char" lorsque nécessaire
//char * sLeft(sString a , int longueur_sz); //renvoie les "n" premiers caractères d'une chaîne
char* sLeft(char * a , int longueur_sz); //renvoie les "n" premiers caractères d'une chaîne
//char* sRight(sString a , int longueur_sz); //renvoie les "n" derniers caractères d'une chaîne (rem: voir sLeft)
char* sRight(char * a , int longueur_sz); //renvoie les "n" derniers caractères d'une chaîne
//char* sMid(sString a , int depart_sz , int longueur_sz); //renvoie une chaîne de longueur "longueur_sz" commençant au caractère déterminé par "depart_sz" (rem: voir sLeft)
char* sMid(char * a , int depart_sz , int longueur_sz); //renvoie une chaîne de longueur "longueur_sz" commençant au caractère déterminé par "depart_sz"
//bool sCompare(sString a , sString b); //compare les deux chaînes de caractères "a" et "b" et renvoie "true" si elles concordent
bool sCompare(char * a , char * b); //compare les deux chaînes de caractères "a" et "b" et renvoie "true" si elles concordent
//int sStrPos(sString a , sString b , int depart_sz); //renvoie la position du premier caractère de "b" trouvé dans "a"
int sStrPos(char * a , char * b , int depart_sz); //renvoie la position du premier caractère de "b" trouvé dans "a"
//char** sSplit(sString a , sString b , int limite_sz); //découpe la chaîne "a" en plusieurs morceaux séparés par "b", "limite_sz" est le nombre de morceaux max à retourner (-1 = max)
/*
//renvoie les "n" premiers caractères d'une chaîne
char * sLeft(sString a , int longueur_sz)
{
//on vérifie si la longueur spécifiée est supérieur à zéro
if( longueur_sz <= 0 )
return ""; //non, on ne retourne rien
int i = 0;
//on vérifie si la longueur demandée n'est pas supérieure ou égale à celle de la chaîne "a"
if( longueur_sz >= a.Len() )
return a; //oui, on retourne la chaîne telle qu'elle était
//on alloue un buffer de la taille de la chaîne de caractères donnée en argument + 1 pour le caractère null
char * buffer_tmp = new char[longueur_sz + 1];
//variable qui va contenir la chaîne de caractères de "a"
char * tmp_a = a;
//on copie la chaîne "a" vers le buffer
for (i=0; i < longueur_sz ; i++)
buffer_tmp[i] = tmp_a[i];
//on place le caractère de fin (null)
buffer_tmp[longueur_sz] = '\0';
//et on retourne le résultat final
return buffer_tmp;
}
*/
//renvoie les "n" premiers caractères d'une chaîne
char * sLeft(char * a , int longueur_sz)
{
//on vérifie si la longueur spécifiée est supérieur à zéro
if( longueur_sz <= 0 )
return ""; //non, on ne retourne rien
int i = 0;
//taille de la chaîne de caractères donnée en argument ("a")
int len_tmp = 0;
while(*a)
{
a++;
len_tmp++;
}
//on remet notre pointeur à zéro
a -= len_tmp;
//on vérifie si la longueur demandée n'est pas supérieure ou égale à celle de la chaîne "a"
if( longueur_sz >= len_tmp )
return a; //oui, on retourne la chaîne telle qu'elle était
//on alloue un buffer de la taille de la chaîne de caractères donnée en argument + 1 pour le caractère null
char * buffer_tmp = new char[longueur_sz + 1];
//on copie la chaîne "a" vers le buffer
for (i=0; i < longueur_sz ; i++)
buffer_tmp[i] = a[i];
//on place le caractère de fin (null)
buffer_tmp[longueur_sz] = '\0';
//et on retourne le résultat final
return buffer_tmp;
}
/*
//renvoie les "n" derniers caractères d'une chaîne
char * sRight(sString a , int longueur_sz)
{
//on vérifie si la longueur spécifiée est supérieur à zéro
if( longueur_sz <= 0 )
return ""; //non, on ne retourne rien
int i = 0 , i2 = 0;
//on vérifie si la longueur demandée n'est pas supérieure ou égale à celle de la chaîne "a"
if( longueur_sz >= a.Len() )
return a; //oui, on retourne la chaîne telle qu'elle était
//on alloue un buffer de la taille de la chaîne de caractères donnée en argument + 1 pour le caractère null
char * buffer_tmp = new char[longueur_sz + 1];
//variable qui va contenir la chaîne de caractères de "a"
char * tmp_a = a;
//on copie la chaîne "a" vers le buffer
for (i=(a.Len() - longueur_sz) ; i < a.Len() ; i++)
{
buffer_tmp[i2] = tmp_a[i];
i2++;
}
//on place le caractère de fin (null)
buffer_tmp[longueur_sz] = '\0';
//et on retourne le résultat final
return buffer_tmp;
}
*/
//renvoie les "n" derniers caractères d'une chaîne
char * sRight(char * a , int longueur_sz)
{
//on vérifie si la longueur spécifiée est supérieur à zéro
if( longueur_sz <= 0 )
return ""; //non, on ne retourne rien
int i = 0 , i2 = 0;
//taille de la chaîne de caractères donnée en argument ("a")
int len_tmp = 0;
while(*a)
{
a++;
len_tmp++;
}
//on remet notre pointeur à zéro
a -= len_tmp;
//on vérifie si la longueur demandée n'est pas supérieure ou égale à celle de la chaîne "a"
if( longueur_sz >= len_tmp )
return a; //oui, on retourne la chaîne telle qu'elle était
//on alloue un buffer de la taille de la chaîne de caractères donnée en argument + 1 pour le caractère null
char * buffer_tmp = new char[longueur_sz + 1];
//on copie la chaîne "a" vers le buffer
for (i=(len_tmp - longueur_sz) ; i < len_tmp ; i++)
{
buffer_tmp[i2] = a[i];
i2++;
}
//on place le caractère de fin (null)
buffer_tmp[longueur_sz] = '\0';
//et on retourne le résultat final
return buffer_tmp;
}
//renvoie une chaîne de longueur "longueur_sz" commençant au caractère déterminé par "depart_sz"
char * sMid(sString a , int depart_sz , int longueur_sz)
{
int i = 0 , i2 = 0;
//on vérifie si on ne dépasse pas la taille de la chaîne
if( (depart_sz + longueur_sz + 1) > a.Len() )
longueur_sz = a.Len() - depart_sz; //on respécifie la longueur de la chaîne à retourner
//on vérifie si la longueur de la chaîne est supérieur à zéro
if( longueur_sz < 0 )
return ""; //non, on ne retourne rien
//on alloue un buffer de la taille de la chaîne de caractères donnée en argument + 1 pour le caractère null
char * buffer_tmp = new char[longueur_sz + 1];
//variable qui va contenir la chaîne de caractères de "a"
char * tmp_a = a;
//on copie la chaîne "a" vers le buffer
for (i=(depart_sz) ; i < (depart_sz + longueur_sz) ; i++)
{
buffer_tmp[i2] = tmp_a[i];
i2++;
}
//on place le caractère de fin (null)
buffer_tmp[longueur_sz] = '\0';
//et on retourne le résultat final
return buffer_tmp;
}
//renvoie une chaîne de longueur "longueur_sz" commençant au caractère déterminé par "depart_sz"
char * sMid(char * a , int depart_sz , int longueur_sz)
{
int i = 0 , i2 = 0;
//taille de la chaîne de caractères donnée en argument ("a")
int len_tmp = 0;
while(*a)
{
a++;
len_tmp++;
}
//on remet notre pointeur à zéro
a -= len_tmp;
//on vérifie si on ne dépasse pas la taille de la chaîne
if( (depart_sz + longueur_sz + 1) > len_tmp )
longueur_sz = len_tmp - depart_sz; //on respécifie la longueur de la chaîne à retourner
//on vérifie si la longueur de la chaîne est supérieur à zéro
if( longueur_sz < 0 )
return ""; //non, on ne retourne rien
//on alloue un buffer de la taille de la chaîne de caractères donnée en argument + 1 pour le caractère null
char * buffer_tmp = new char[longueur_sz + 1];
//on copie la chaîne "a" vers le buffer
for (i=(depart_sz) ; i < (depart_sz + longueur_sz) ; i++)
{
buffer_tmp[i2] = a[i];
i2++;
}
//on place le caractère de fin (null)
buffer_tmp[longueur_sz] = '\0';
//et on retourne le résultat final
return buffer_tmp;
}
/*
//compare les deux chaînes de caractères "a" et "b" et renvoie "true" si elles concordent
bool sCompare(sString a , sString b)
{
//on vérifie d'abords si la longueur des deux chaîne est la même
if( a.Len() != b.Len() )
return false;
//on récupère sous forme "char" "a" et "b"
char * tmp_a = new char[a.Len()] = a;
char * tmp_b = new char[b.Len()] = b;
//on compare chaque caractère correspondant
for( int i=0 ; i<=a.Len() ; i++ )
{
if(tmp_a[i] != tmp_b[i])
return false;
}
//si on arrive jusqu'ici, c'est que les deux chaînes sont identiques
return true;
}
*/
//compare les deux chaînes de caractères "a" et "b" et renvoie "true" si elles concordent
bool sCompare(char * a , char * b)
{
//taille de la chaîne de caractères donnée en argument ("a")
int len_a = 0;
while(*a)
{
a++;
len_a++;
}
//on remet notre pointeur à zéro
a -= len_a;
//taille de la chaîne de caractères donnée en argument ("b")
int len_b = 0;
while(*b)
{
b++;
len_b++;
}
//on remet notre pointeur à zéro
b -= len_b;
//on vérifie d'abords si la longueur des deux chaîne est la même
if( len_a != len_b )
return false;
//on compare chaque caractère correspondant
for( int i=0 ; i<=len_a ; i++ )
{
if(a[i] != b[i])
return false;
}
//si on arrive jusqu'ici, c'est que les deux chaînes sont identiques
return true;
}
/*
//renvoie la position du premier caractère de la chaîne "b" trouvée dans "a"
int sStrPos(sString a , sString b , int depart_sz = 0)
{
//on vérifie si la taille de la chaîne à chercher n'est pas plus grande que la chaîne dans laquelle il faut chercher
if( (b.Len() + depart_sz) > a.Len() )
return -1;
//on calcule le nombre d'itérations à effectuer
int iterations_sz = a.Len() - (b.Len() + depart_sz);
//on fait une boucle
for(int i=depart_sz ; i <= iterations_sz ; i++ )
{
//on vérifie si la chaîne de caractères (dans "b") de même taille que "a" et commençant au caractère "i" n'est pas = à "a"
if( sCompare(sMid(a , i , b.Len()) , b) )
return i;
}
//si on arrive ici, c'est qu'on a rien trouvé
return -1;
}
*/
//renvoie la position du premier caractère de la chaîne "b" trouvée dans "a"
int sStrPos(char * a , char * b , int depart_sz = 0)
{
int i2=0;
//taille de la chaîne de caractères donnée en argument ("a")
int len_a = 0;
while(*a)
{
a++;
len_a++;
}
//on remet notre pointeur à zéro
a -= len_a;
//taille de la chaîne de caractères donnée en argument ("b")
int len_b = 0;
while(*b)
{
b++;
len_b++;
}
//on remet notre pointeur à zéro
b -= len_b;
//on vérifie si la taille de la chaîne à chercher n'est pas plus grande que la chaîne dans laquelle il faut chercher
if( (len_b + depart_sz) > len_a )
return -1;
//on calcule le nombre d'itérations à effectuer
int iterations_sz = len_a - (len_b + depart_sz);
//on fait une boucle
for(int i=depart_sz ; i2 <= iterations_sz ; i++ )
{
//on vérifie si la chaîne de caractères (dans "b") de même taille que "a" et commençant au caractère "i" n'est pas = à "a"
if( sCompare(sMid(a , i ,len_b) , b) )
return i;
i2++;
}
//si on arrive ici, c'est qu'on a rien trouvé
return -1;
}
//découpe la chaîne "a" en plusieurs morceaux séparés par "b", "limite_sz" est le nombre de morceaux max à retourner (-1 = max)
sString * sSplit(char * a , char * b , int limite_sz , int &taille_finale)
{
int i=0 , pos=-1 , pos2=0 ;
sString * tmp_res;
//taille de la chaîne de caractères donnée en argument ("a")
int len_a = 0;
while(*a)
{
a++;
len_a++;
}
//on remet notre pointeur à zéro
a -= len_a;
//taille de la chaîne de caractères donnée en argument ("b")
int len_b = 0;
while(*b)
{
b++;
len_b++;
}
//on remet notre pointeur à zéro
b -= len_b;
//on parcourt la chaîne "a" à la recherche de "b" autant de fois que "b" s'y trouve
do
{
pos = sStrPos(a , b , pos + 1);
i++;
}while(pos > 0);
//si la limite est à zéro on renvoie un tableau avec une seule valeur
if(limite_sz == 0)
{
//on quitte ici
tmp_res = new sString[0];
tmp_res[0] = "";
return tmp_res;
//si une limite est spécifiée, on vérifie s'il faut en tenir compte
}else if(limite_sz > 0){
if(i > limite_sz)
{
i = limite_sz;
}
}
//on spécifie le nombre de résultats que le tableau va contenir
taille_finale = i;
//on crée un tableau de type "sString" de la taille indiquée par "i"
tmp_res = new sString[i];
//on décrémente i
i--;
//on remet la position de départ à -1 (on y ajoute 1 par la suite à chaque itérations de la boucle for)
pos = -1;
//pos2 commence lui à zéro et va prendre la valeur de pos avant que celui-ci ne change
pos2 = 0;
for(int i2=0 ; i2<i ; i2++ )
{
//on récupère la position de la première occurence de la chaîne "b" dans la chaîne "a"
pos = sStrPos(a , b , pos + 1);
//on récupère la chaîne de caractères située entre "pos2" et "pos" et on la place dans notre tableau
tmp_res[i2] = sMid(a , pos2 , pos-pos2);
pos2 = pos + len_b;
}
//on récupère la fin de la chaîne
tmp_res[i2] = sMid(a , pos2 , len_a-pos2);
return tmp_res;
}
Historique
- 11 décembre 2004 16:10:35 :
- les "fuites mémoire" ont été corrigées (celles qui avaient été pointées)
les "typedef" ont été supprimés
- 12 décembre 2004 17:24:32 :
- quelques changements mineurs
- 12 décembre 2004 21:22:45 :
- ajout d'une fonction de conversion d'une chaîne de caractères en entier (int)
- 12 décembre 2004 21:43:18 :
- la fonction de conversion en entier a été "améliorée" : gain de vitesse mais peut générer une erreur si un caractère n'est pas un chiffre
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MATRICE TEMPLATEMATRICE TEMPLATE par hjr2610
Cliquez pour lire la suite par hjr2610 RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|