Chaine de caractéres

niamor23 Messages postés 11 Date d'inscription lundi 20 mars 2006 Statut Membre Dernière intervention 7 janvier 2009 - 12 févr. 2007 à 09:59
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 - 12 févr. 2007 à 15:13
Salut, voici mon probléme, mon programme contient une chaine de caractéres avec des espaces, et je voudrais envoyé chaque bloc de caractére séparé par des espaces, vers un tableau.

exemple:
AnsiString valeur="1234 5678 9412";
char tab[50];

voila ce que je voudrais avoir en utilisant une fonction:
tab[1]=1234
tab[2]=5678
tab[3]=9412

Merci d'avance pour la réponse.

a+

6 réponses

yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
12 févr. 2007 à 12:22
Salut !

Déjà il y a un souci avec la déclaration de ton tab.
Dans tab[50] tu ne peux pas mettre tout ça.
Voilà un exemple de ce que tu pourrais faire.

int i = 0;
char tab[10][50], * c; // tab[10][50] pour 10 chaines de 49 caractères maximum chacune.

c = valeur;
while(*c)
{
    if(*c == ' ')
    {
        *c = 0;
        strcpy(tab[i], valeur);
        i++;
    }
    c++;
}
strcpy(tab[i], valeur);

Pas testé mais ça devrait être ça.
Tiens moi au courant.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
0
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
12 févr. 2007 à 14:30
Salutn je te conseil d'utiliser Boost qui fait ca tres bien :

#include


#include








// découpe la chaine selon les séparateurs donnés

vector<string> split( const std::string & Msg, const std::string & Separators )
{
// typedef pour alléger l'écriture
typedef boost::tokenizerchar> > my_tok;

// vector pour le resultat
vector<string> v;

// séparateur personnalisé
boost::char_separator<char> sep( Separators.c_str() );

// construire le tokenizer personnalisé
my_tok tok( Msg, sep );

// itérer la séquence de tokens
for ( my_tok::const_iterator i = tok.begin();
i != tok.end();
++i )
{
v.push_back(*i);
}
}

int main()
{
string valeur="1234 5678 9412";
vector<string> v=split(valeur, " ");
}





Ainsi tu as tout tes resultats dans v[0], v[1], ...

<hr size="2" width="100%" />TuRn3r
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
12 févr. 2007 à 14:32
yoyo>> Tu recopie 1234 dans toute les chaines car tu utilise valeur qui ne change jamais

Voici quelque chose d'optimisé (je pense):

char buffer[] = "1234 5678 9012", *c = buffer;
char tab[4][10];
int j = 0;

do
{
    int k = 0;    while(*c !' ' && *c) tab[j][k++] *c++;
    tab[j++][k] = 0;
} while(*c++);

C++ (@++)<!--
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
12 févr. 2007 à 14:37
Oups ! Très juste SAKingdom !
Oublié un petit quelque chose moi.
int i = 0;
char tab[10][50], * c, * d; // tab[10][50] pour 10 chaines de 49 caractères maximum chacune.
d c valeur;
while(*c)
{
    if(*c == ' ')
    {
        *c = 0;
        strcpy(tab[i], d);
        i++;
        c++;
        d = c;
    }
    else c++;
}
strcpy(tab[i], d);

Là ça sera déjà mieux.
En plus c'est super rapide.

YOYO, @+.

"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
0

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

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
12 févr. 2007 à 14:56
Mais le problème avec ton code, c'est que tu parcoure toute la chaine 2x alors qu'une seule suffirait:


while(*c)

{

    if(*c == ' ')


On cherche jusqu'à trouver un espace


    strcpy(tab[i], d);


On revient au début du mot puis on reparcoure une seconde fois jusqu'à
l'espace (remplacé par 0, on se retrouve donc, en plus, avec une chaine initiale
modifiée).

______

do

{

    int k = 0;

    while(*c !' ' && *c) tab[j][k++] *c++;


On copie dans tab[j] tout les caractères rencontrés jusqu'à tomber sur un espace ou sur un 0.


    tab[j++][k] = 0;

} while(*c++);


On ajoute le 0 à la chaine destinatrice (on conserve donc la chaine
initial intacte) puis on test le caractère. Si il s'agit d'un caractère
(l'espace ici), on le saute et on continue sinon, il s'agit du 0 de fin
de chaine donc on quitte. On a parcourue la chaine qu'une seule fois.

C++ (@++)<!--
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
12 févr. 2007 à 15:13
C'est vrai que j'avais pas fait attention qu'en utilisant le strcpy() je faisais 2 parcours.
Donc je suis complètement ok avec toi.
Rien à dire ! 20/20

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
0
Rejoignez-nous