Commande pour tronquer

elodie1511 Messages postés 80 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 3 septembre 2004 - 22 mars 2004 à 09:52
lpikachu58 Messages postés 351 Date d'inscription samedi 2 février 2002 Statut Membre Dernière intervention 6 mai 2004 - 23 mars 2004 à 14:11
bonjour, je souhaiterais faire comme la commande substr() en php mais en C++?
merci
elodie

13 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 mars 2004 à 10:17
Regarde strstr().

ciao...
BruNews, Admin CS, MVP Visual C++
0
elodie1511 Messages postés 80 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 3 septembre 2004
22 mars 2004 à 10:46
c'est comme en php, c'est
strstr(variable, chiffre);?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 mars 2004 à 11:29
Jamais fait de php.

char *strstr(const char *string, const char *strSearch);

Details dans MSDN, tres simple.

ciao...
BruNews, Admin CS, MVP Visual C++
0
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
22 mars 2004 à 14:04
En C++,
les std::string fournissent déjà la fonction substr
ex:int position 2, longueur 4;
std::string chaine = "Bonjour";
std::string sub = chaine.substr( position, longueur );
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
elodie1511 Messages postés 80 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 3 septembre 2004
22 mars 2004 à 14:28
si je fais ce que tu me dis ça me met ça comme erreur:

error C2653: 'std' : is not a class or namespace name
: error C2065: 'string' : undeclared identifier
(99) : error C2146: syntax error : missing ';' before identifier 'chaine'
(99) : error C2065: 'chaine' : undeclared identifier
(100) : error C2653: 'std' : is not a class or namespace name
(100) : error C2146: syntax error : missing ';' before identifier 'sub'
(100) : error C2065: 'sub' : undeclared identifier
(100) : error C2228: left of '.substr' must have class/struct/union type
(101) : error C2653: 'std' : is not a class or namespace name

et j'ai un peu de mal a comprendre, comment je peux mettre la reponse dans une variable?
merci
elodie
0
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
22 mars 2004 à 14:42
Visual C++ 6.0 ?

#include
#include <string>
using namespace std;

int main() {
string chaine = "BONJOUR";
string sub= chaine.substr( 2, 4 );
cout << sub << endl;
}

Il faut ajouter /GX comme paramètre à la compilation.
(Exception Handler). Il doit y avoir cette option
quelque part dans VC.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 mars 2004 à 14:45
elodie1511,
j'ai compris ton substr, tu ne te crois pas capable d'ecrire cette mini func ???
Aucun besoin de std, string et autres cochonneries qui vont inserer une masse de code inutile dans ton exe, sans compter que ces 'string' passent leur temps en alloc desalloc et fractionnent l'espace memoire du processus.
Si on ne veut point programmer, y a VB pour le tout fait.

ciao...
BruNews, Admin CS, MVP Visual C++
0
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
22 mars 2004 à 15:42
1.Je ne pensais pas que les admins étaient autoriser
à troller ( c'est bien du troll, non? au vu des arguments
sur la mémoire ). Je ne peux lutter évidement (sous peine de sanctions cerataines) donc je ne dis rien.

2. Je ne suis pas spécialiste du C mais il faut regarder
du côté du strncpy, voici un exemple (mais j'espère
que les gurus du C me corrigeront )

int main()
{
const char* cchaine = "BONJOUR";
char* csub = (char*)malloc( strlen(cchaine)+1 );
strncpy( csub, cchaine + 2, 4 );
csub[4] = '\0';

printf( "[%s]\n", csub );
free( csub );
}

3. Si tu veux vraiment programmer, fais plutôt de l'assembleur. Bon courage elodie.

Bon appprentissage en tout cas.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 mars 2004 à 15:48
Hylvenir > je ne comprends pas le point 1.
Sanctions ? pour quoi faire, on peut discuter des avantages et inconvenients des diverses methodes en personnes civilisees, pas de prob.
Penses tu qu'ecrire un substr avec le buffer cible en param soit difficile, serieux non, et ainsi nenni alloc puisque l'appelant sait combien il en veut.
ASM n'entre pour rien dans l'affaire, un debutant doit s'entrainer a prog ces petites funcs, tres bon exercice.

ciao...
BruNews, Admin CS, MVP Visual C++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 mars 2004 à 17:10
Voila fait, pas eu le temps avant.
bSubStr retourne en plus la longueur reellement inseree, cela sans strlen grace aux pointeurs.

#include <windows.h>

char szbuff[60];

int bSubStr(char *sztxt, int deb, int len, char *szdst)
{ // deb BASE 0
char *c, *d;
c = sztxt;
while(deb > 0) {
if(*c == 0) break;
deb--; c++;
}
d = szdst;
while(len > 0) {
if(!(*d = *c++)) goto subEnd;
len--; d++;
}
*d = 0;
subEnd:
return (d - szdst);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR szcmdline, int)
{
char szdest[24];
int R;
strcpy(szbuff, "youpi salut la foule");
R = bSubStr(szbuff, 8, 20, szdest);
itoa(R, szbuff, 10);
MessageBox(0, szdest, szbuff, 0);
return 0;
}

ciao...
BruNews, Admin CS, MVP Visual C++
0
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
22 mars 2004 à 18:51
Ouf, j'ai eu peur de tomber sur un intégriste C-ien comme
on en trouve parfois mais j'adore pinailler avec des personnes compétentes. Je suis d'accord pour les petits
exercices. le strncpy est indéfini si la cible chevauche la
source donc attention. L'exemple était pour illustrer
la différence entre la taille static du C (buffer de 24 par
exemple) contre le dynamisme du C++ (au pris de la lenteur
et d'autres cochonneries je vous l'accorde).

Sinon compliquée comme méthode à mon goût,
et celle-là ?

char* substr( char* ori, int deb, int lg, char* dest ) {
char* destSave = dest;
dest[lg] = '\0';
ori += deb;
while( lg-- && ( *dest++ = *ori++ ) ) ;
return destSave;
}

plus simple, plus courte et environ 10% plus rapide en moyenne sur mes deux environnements et ça fait la même chose (à mes bug près of course).
PS: la version std::string est environ deux fois plus lente...
et VC++ est obtient les plus mauvais score à mon bench.
PPS: il est trivial d'ajouter les contrôles sur deb, lg
et renvoyer la longueur réellement copiée.
C'est dommage que je n'ai pas le temps de jouer un peu.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 mars 2004 à 19:10
Tu sais pourquoi j'ai l'habitude de retourner la longueur ?
Aucun besoin de strcat pour chainer a la suite, on ne refera pas le parcours de chaine.

ciao...
BruNews, Admin CS, MVP Visual C++
0
lpikachu58 Messages postés 351 Date d'inscription samedi 2 février 2002 Statut Membre Dernière intervention 6 mai 2004 2
23 mars 2004 à 14:11
Utilise les CString

be linux
0
Rejoignez-nous