Bonjour,
j'aimerai compter le nombre d'occurrence du caractère ' (apostrophe) dans une chaine de caractère (String) .
J'aimerai faire cela afin de pouvoir doubler l'apostrophe à chaque occurrence dans cette même string
merci d'avance
Version imprimable
Bonjour,
j'aimerai compter le nombre d'occurrence du caractère ' (apostrophe) dans une chaine de caractère (String) .
J'aimerai faire cela afin de pouvoir doubler l'apostrophe à chaque occurrence dans cette même string
merci d'avance
Salut,
Tu peux utiliser la fonction count_if (disponible dans l'espace de noms std par inclusion du fichier <functional>) pour y arriver assez rapidement :D
un petit exemple:
ou, si tu ne veux pas te taper l'écriture d'un tas de fonctions finalement similaires (pour tous les caractères que tu voudrais pouvoir compter), tu peux envisager une fonction template proche deCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <iostream> // pour l'affichage #include <algorithm> // pour (entre autre) count_if bool isAppostrophe(char const c) { return c=='\''; } int main() { std::string str("salut\'\'comment va\'tu?"); int val=std::count_if(str.begin(),str.end(),isAppostrophe); std::cout<<val; return 0; }
que tu utiliserais sous la forme deCode:
1
2 template <char c> bool isChar(char const c2){return c2==c;}
Et il serait même possible d'envisager d'utiliser un foncteur, mais bon, est-ce utile :question:Code:
1
2
3
4
5
6
7
8
9
10 int main() {int main() { std::string str("salut comment va tu?"); std::cout<<std::count_if(str.begin(),str.end(),isChar<'c'>)<<std::endl <<std::count_if(str.begin(),str.end(),isChar<'m'>)<<std::endl <<std::count_if(str.begin(),str.end(),isChar<'a'>)<<std::endl <<std::count_if(str.begin(),str.end(),isCharFun<' '>)<<std::endl; return 0; }
Merci pour cette réponse claire !
Salut,
S'il s'agit de remplacer un caractère par un autre, tu peux utiliser std::replace :Voir l'ensemble des algos dans ce tuto : Les algorithmes de la STL, par r0d.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 #include <string> #include <algorithm> #include <iterator> #include <iostream> int main() { std::string chaine("salut\'\'comment vas\'tu?"); std::replace(chaine.begin(),chaine.end(),'\'','\"'); std::cout<<"chaine = "<<chaine<<"\n"; return 0; }
Je crois que le PO veut dédobuler les apostrophes (sans doute parce qu'il fait de l'SQL à coté ;))
Voici un code que j'ai écrit dans une autre vie:Il ne doit pas être bien compliqué à modifier en remplaçant _bstr_t par std::string ou wstring.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 _bstr_t DoubleApos(const _bstr_t & inStr) { _bstr_t outStr; BSTR p=inStr; if (p) { wchar_t wc[2]; wc[1]=0; unsigned int u=0,vMaxSize=inStr.length(); while ((wc[0]=*p)!=0 && u<vMaxSize) { outStr+=wc; if (wc[0]==L'\'') outStr+=wc; u++; p++; } } return outStr; }
Et comme je suis sympa, voici une solution plus générale toute faite :Pà utiliser comme ceci par exempleCode:
1
2
3
4
5
6
7
8
9 #define STR_LEN(s) (s),(sizeof(s)-1) void FindAndReplace(std::string & s,const char *os,unsigned oslen,const char *ns,unsigned nslen) { if (os==0 || oslen==0) return; for (std::string::size_type pos=0;(pos=s.find(os,pos,oslen))!=s.npos;pos+=nslen) s.replace(pos,oslen,ns,nslen); }
Code:FindAndReplace(ma_string,STR_LEN("'"),STR_LEN("''"));
Merci beaucoup pour toutes ces précisions