CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Splitter un char (C++)

techslash
techslash
Niveau 8
14 avril 2003 à 21:43:50

Je commence à être à cour d´idée pour ça. Je possède un tableau char qui contient une ligne de texte dans laquelle se trouve un =. J´ai une procédure qui identifie la position du = dans le tableau. J´ai besoin d´être apte à placer ce qui est avant le = dans une autre variable char ( tableau) et ce qui vient après dans une variable int. Autrement dit, j´ai besoin d´être capable d´identifier quoi est égal à quoi dans ma ligne de texte.

Quelqu´un sait comment faire ça ? ?? Y´a substr mais ça demande l´utilisation de " string" au lieu de " char" et ce système m´intéresse pas. Et tout ça c´est sans compter que je dois trouver une façon pour m´assurer que ce qui est après le = est bien un int avant de placer ça en variable... Que de complications... : ´(.

Kelios
Kelios
Niveau 8
14 avril 2003 à 22:42:07

T´as toujours la solution du maso: ta fonction inline asm!

Je ne te promets rien, je vais tenter de t´en écrire une ici, tu pourrait partir de ça:

/*************************************************

    • *******

Array: pointeur à à ton string
Texte_return : pointeur à un string qui recevra la première partie,
avant le =
chiffre_return : pointeur à un int qui recevra la deuxième
ReturnValue : 0 = réussi, 1 = il y a eu un non-chiffre dans la deuxième partie, 2 = string incomplète

    • ***********************************************
    • ******/

int Split(char *array, char *texte_return, int *chiffre_return)
{

/*Détails importants:
61 ascii = ´=´

Rendu aux chiffres, on va se servir du décalage ascii de 48, car 0 = 48(´0´) - 48, 1 = 49(´1´) - 48, ect...
*/

__asm
{
xor ecx, ecx //Prépare ecx et ebx : par précaution
xor ebx, ebx

text_fill:
mov eax, array[ecx]//Prochain byte à analiser dans eax
cmp eax, 61 //Si on est rendu à =
je pass_eq //On passe au fillage des chiffres
cmp eax, 0 //Si c´est le caractère NULL
je null_err //On quitte avec un r/v de 2
mov texte_return[ecx], eax//Sinon, on passe le byte au texte_return
inc ecx //Et on incrémante notre comteur de bytes

pass_eq:
inc ecx//Un byte passé pour le charactère =

chiffre_fill:
mov eax, array[ecx]

//Si n´est pas un chiffre en ascii, on a une erreur
cmp eax, 48
jb chiffre_err
cmp eax, 57
ja chiffre_err

//Si c´est un caractère NULL, on quitte
cmp eax, 0
je norm_quit

//Sinon, on soustrait 48 au chiffre et on le passe au chiffrebuf, qui aura son dernier nombre de libre
sub eax, 48
add ebx, eax

//Et on le shifte à gauche, comme l´on ferait *2 en binaire
mul ebx, 10
inc ecx//On incrémente, et on recommence
norm_quit:
mov [chiffre_return], ebx
}
return 0;
null_err:
return 2;
chiffre_err:
return 1;
}

Mais je suis pratiquement sur qu´il existe une fonction de string.h qui pourrait faire ça... t´es sur d´avoir bien cherché?

En tout cas, si il n´y as vraiment rien, sert toi de mon exemple ; P

Kelios
---------

techslash
techslash
Niveau 8
14 avril 2003 à 22:44:24

Ouf merci mais c´est p-e un peu trop pour moi =p.

Bien cherché... je sais pas trop où chercher justement =s.

GamerFou2
GamerFou2
Niveau 7
14 avril 2003 à 22:44:29

Bon je sais d´avance que l´indentation va être éjectée mais bon je te laisse remettre en forme tout ca . ...

char *CopyBeforeChar(char _car, char *_chs, char *_chd)
{
if ( !_chs || ! _chd) return NULL;

while(*_chs && ( *_chs ! = _car)) *_chd++ = *_chs++;
*_chd = 0;

if ( *_chs) _chs++;

return _chs;
}

int isNumeric(char *_str)
{
if ( !_str) return false;

while ( *_str)
{
if ( *_str < ´0´ || *_str > ´9´)
return false;
_str++;
}

return true;
}

Petit exemple d´utilisation :

char TaLigne[] = " blabla=10";
char Partie1[32];
char Partie2[32];
char *ptr = TaLigne;
int testNumerique;

ptr = CopyBeforeChar(´=´,ptr,Partie1);
ptr = CopyBeforeChar(0,ptr,Partie2);
testNumerique = isNumeric(Partie2);

GamerFou2
GamerFou2
Niveau 7
14 avril 2003 à 22:47:08

Et j´oubliais ( c´est l´âge désolé) pour récupérer la valeur d´une chaine en entier tu as des fonctions toutes faites : atoi(chaine) etc...

JeanYvesYves
JeanYvesYves
Niveau 10
14 avril 2003 à 22:54:27

salut : )

mais non, pas de problemes avec des tableaux de char !

je te propose une solution :

  1. include < string.h>
  2. include < stdlib.h>

void main()
{
char c; // ta chaine entiere
char e; // sera la chaine avant le =
nombre de droite
int n; // sera le nombre ( a droite du =)
int a; // temporaire

. ... // ici tu remplis ta chaine c

a=0;
while(c[a]!=´=´ && c[a]!=´\0´) // trouve le =
a++;
if ( c[a]==´\0´) {printf("pas de =\n");return;}
// si y´a pas de =
e=new char[a]; // alloue la mem pour e
strncpy(e,c,a-1); // copie la partie gauche dans e.
e[a-1]=´\0´; // fixe la caractere de fin
n=atoi(c+a+1); // habille manip de pointeurs : donen la chaine qui commence au caractere juste apres le =. atoi converti la chaine en nombre.

printf("%s = %d\n",e,n);

}

voila, a moins d´une faute, ( car j´ai pas testé), ça devrait marcher. Tiens moi au courant

Kelios
Kelios
Niveau 8
14 avril 2003 à 22:55:16

"
Ouf merci mais c´est p-e un peu trop pour moi =p.
"
Dommage, l´inline assembly aurait surement aidé dans ce cas ci, ça aurait été plus rapide ( quoi que?!)

"
Bien cherché... je sais pas trop où chercher justement =s.
"
Ici par exemple:
http://www.cplusplus.com/ref/

Kelios
---------

techslash
techslash
Niveau 8
14 avril 2003 à 23:19:36

Bin ça parle au yable, j´ai réussi à faire tout ça en 8 lignes de code avec strtok() ! !! Merci à tlm pour votre et aide et particulièrement à Kelios pour le site qui m´a éclairé un peu ; ).

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment