Seuls les membres ayant 30 points peuvent parler sur le chat.

Forum Casio - Autres questions


Index du Forum » Autres questions » [C]Insertion de caractère
Alphacreator Hors ligne Membre Points: 1464 Défis: 43 Message

[C]Insertion de caractère

Posté le 29/04/2014 17:42

Hello world,
Je travaille actuellement sur une fonction de saisie en C avec un curseur permettant de placer des caractères entre d'autres caractères (ou d'en supprimer), existe-t-il donc une fonction permettant d'intercaler (ou de supprimer) un caractère dans un tableau de char tout en déplaçant la suite? Ou alors faut-il que je crée ma propre fonction?


1, 2 Suivante
Nemhardy Hors ligne Grand maître des Traits d'Esprit Points: 1235 Défis: 54 Message

Citer : Posté le 29/04/2014 17:50 | #


Tu dois pouvoir utiliser memmove pour décaler tes données (en écrasant dans le cas d'une suppression) et ensuite tu peux écrire dans la case souhaitée si c'est un rajout.
N'attendez pas qu'il n'y ait plus de miel : スススススススススススススススススススススススススス養蜂家スススススススススススススススススススススススススススススススススススス蜂家
Lephenixnoir En ligne Administrateur Points: 18156 Défis: 142 Message

Citer : Posté le 29/04/2014 17:51 | #


Il y a deux "problèmes" à ce que tu cherches.
Premièrement, il faut déplacer la suite de la chaîne.
Deuxièmement, il faut qu'il reste assez d'espace pour pouvoir la décaler, cette suite.

Si la taille allouee est insuffisante
  On realloue une taille suffisante
Fin Si

On deplace la suite de la chaine
On insere le(s) caractere(s) dans l'espace libere


Ce qui donne en C, avec ch la chaîne d'origine, sup celle à insérer et pos l'index où se trouver le premier caractère inséré:
if(tailleAlloue<strlen(ch)+strlen(sup))
{
  char *tmp;
  tmp = realloc(ch, strlen(ch)+strlen(sup)+1);
  if(tmp==NULL) return;
  ch = tmp;
}

memmove(ch+pos,ch+pos+strlen(sup),strlen(sup));
strncpy(ch+pos,sup,strlen(sup));
Alphacreator Hors ligne Membre Points: 1464 Défis: 43 Message

Citer : Posté le 29/04/2014 18:41 | #


J'ai fait quelques tests avec memmove, mais cela ne fait rien
    char *test=malloc(maxChar);
    test="test";
    PrintXY(1,1,test,0);
    memmove(test,test+3,1);
    PrintXY(1,10,test,0);
Le texte ne change pas
Lephenixnoir En ligne Administrateur Points: 18156 Défis: 142 Message

Citer : Posté le 29/04/2014 18:55 | #


Oui, ça ne peut pas fonctionner.
void decaler(char *ch, int debut, int longueur)
{
  int i;
  for(i=longueur-1 ;i+1;i--) ch[debut+longueur+i] = ch[debut+i];
}
Alphacreator Hors ligne Membre Points: 1464 Défis: 43 Message

Citer : Posté le 29/04/2014 19:04 | #


C'est bizarre, je ne peux pas modifier un élément du tableau, chaque fois que je veux modifier quelque chose, il n'en fait rien
Lephenixnoir En ligne Administrateur Points: 18156 Défis: 142 Message

Citer : Posté le 29/04/2014 19:07 | #


Tu as essayé avec le code juste au-dessus ?
Avec moi, ça fonctionne.
Alphacreator Hors ligne Membre Points: 1464 Défis: 43 Message

Citer : Posté le 29/04/2014 19:08 | #


J'ai essayé mais non, marche toujours pas
Lephenixnoir En ligne Administrateur Points: 18156 Défis: 142 Message

Citer : Posté le 29/04/2014 19:13 | #


#include <stdio.h>

void decaler(char *ch, int debut, int longueur)
{
  int i;
  for(i=longueur-1 ;i+1;i--) ch[debut+longueur+i] = ch[debut+i];
}

int main()
{
  char ch[20] = "DebutFin";
  decaler(ch,5,3);
  printf("%s\n",ch);
  return 0;
}

Essaie ça, sur un PC.
Ça doit fonctionner.
Alphacreator Hors ligne Membre Points: 1464 Défis: 43 Message

Citer : Posté le 29/04/2014 19:21 | #


Sur un PC ça marche mais pas sur ma caltos (après serai-ce dût à l'allocation dynamique?)
Lephenixnoir En ligne Administrateur Points: 18156 Défis: 142 Message

Citer : Posté le 29/04/2014 19:23 | #


Je ne pense pas, mais tu peux vérifier.
Dans ton add-in, est-tu sûr que les données ne sont pas copiées ou autre ?
Alphacreator Hors ligne Membre Points: 1464 Défis: 43 Message

Citer : Posté le 29/04/2014 19:35 | #


C'est effectivement dût à l'allocation:
    char str[20]="TEST test";
    decaler(str,5,3);
    PrintXY(1,1,str,0);
    ML_display_vram();
Marchera alors que
    char *str=malloc(20);
    str="TEST test";
    decaler(str,5,3);
    PrintXY(1,1,str,0);
    ML_display_vram();
Ne marchera pas Du coup il va falloir que je trouve une autre solution car je vais avoir du mal sans allouer car je ne pourrais pas avoir une taille variable pour mes tableaux.
Lephenixnoir En ligne Administrateur Points: 18156 Défis: 142 Message

Citer : Posté le 29/04/2014 19:39 | #


J'ai testé avec l'allocation dynamique sur PC, et ça fonctionne.
Alphacreator Hors ligne Membre Points: 1464 Défis: 43 Message

Citer : Posté le 29/04/2014 20:32 | #


L'autre solution serait de créer un chaîne de taille fixe (256 octets je pense) que je pourrais modifier avec ta fonction.
Lephenixnoir En ligne Administrateur Points: 18156 Défis: 142 Message

Citer : Posté le 29/04/2014 20:53 | #


Ma fonction est incomplète, en fait voilà le vrai code.

void decaler(char *ch, int debut, int longueur, int dec)
{
  int i;
  for(i=longueur-1;i+1;i--) ch[debut+dec+i] = ch[debut+i];
  for(i=debut+longueur;i<debut+dec;i++) ch[i] = 32;
}

ch est la chaîne où l'on décale, debut l'index du premier caractères à décaler, longueur la longueur de la chaîne à décaler (strlen(ch)-debut), et dec la longueur du décalage.
La deuxième boule remplit de blancs l'espace entre la fin du bloc non décalé ([0;debut[) et le debut du bloc décalé ([debut+dec;strlen(ch)[). Tu n'en as pas forcément besoin, c'est surtout pour éviter que si l'on décale de plus que la longueur du bloc à décaler, des 0 restent au milieu et coupent la chaîne.
Alphacreator Hors ligne Membre Points: 1464 Défis: 43 Message

Citer : Posté le 29/04/2014 21:09 | #


Euh, ça me donne des trucs bizarre parfois... Du genre "Test ttestzP f nY" pour la chaîne "Test test" (de 20 caractères) et avec decaler(str,5,4,1);
Par contre ça ne marche toujours pas avec l'allocation. Du coup je vais me débrouiller différemment.
Lephenixnoir En ligne Administrateur Points: 18156 Défis: 142 Message

Citer : Posté le 29/04/2014 21:41 | #


Non, c'est normal.
C'es ton allocation qui n'a pas vidé le tableau.
Du coup tu te retrouves avec de la mémoire non nettoyée au bout de ta chaîne.

En fait c'est parce que ma fonction a écrasé le 0 de fin et ne l'a pas remis.
Alphacreator Hors ligne Membre Points: 1464 Défis: 43 Message

Citer : Posté le 30/04/2014 07:35 | #


Bon, j'ai modifié ta fonction en prenant compte ton message (ch[debut+dec+1]='\0';) et je remplis ma chaîne avec des espaces au début. Par contre c'est toujours pareil, ça marche quand j'initialise normalement mais quand j'alloue, rien.
Lephenixnoir En ligne Administrateur Points: 18156 Défis: 142 Message

Citer : Posté le 30/04/2014 07:38 | #


Sur PC aussi ?
Alphacreator Hors ligne Membre Points: 1464 Défis: 43 Message

Citer : Posté le 30/04/2014 12:32 | #


Justement, avec visual C++ je n'arrive pas à faire char *str=malloc(20)
Mais je me demande si ce n'est pas une question de pointeurs, je suis en train de regarder
Lephenixnoir En ligne Administrateur Points: 18156 Défis: 142 Message

Citer : Posté le 30/04/2014 12:35 | #


#include <stdlib.h>

int main()
{
  char *str = (char *)malloc(20);
  return 0;
}

Si ceci ne fonctionne pas...
1, 2 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
Pour coloriser votre code, cliquez ici.
Sinon cliquez sur le bouton ci-dessous.
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2020 | Il y a 57 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd