salut,
je cherche si il y a une fonction en C qui supprime un caractere d'une chaine donnee( comme RemoveString en java).
merci
Version imprimable
salut,
je cherche si il y a une fonction en C qui supprime un caractere d'une chaine donnee( comme RemoveString en java).
merci
Rien de tel en C, tu peux retrouver le caractère à supprimer avec la fonction strchr, le reste bin tout dépend, tu peut par exemple décaler les caracteres suivant de -1 à chaque fois par exemple, enfin y'a plusieures méthodes pour faire ca ;)
Bonjour,
effectivement, le mieux est sans doute de retrouver ton caractère, puis de décaler tous les caractères suivant d'un cran à gauche.
Une utilisation correcte de memmove() permet ça. Attention, la chaine doit être modifiable. (gcc : compiler avec -Wwritable-string évite de faire des bêtises...)Citation:
Envoyé par m@rki
Un petit code sans memmove() pour le décalage.
Ce qui est bien quand il s'agit de supprimer, c'est que bien fait, ça peut se faire aussi bien "sur place" que d'une chaîne à l'autre...
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 #include <stddef.h> size_t str_remove_chars( char *dest, //[out] Destination buffer. MUST be at least as long as src. char const *src, //[in] Source string. Can be equal to dest. char const *chars //[in] Chars to remove. ) { size_t iSrc,iDest; char c; for(iSrc=0,iDest=0 ; (c=src[iSrc]) != '\0' ; iSrc++) { if(strchr(chars, c)==NULL) dest[iDest++] = c; } dest[iDest] = '\0'; return iDest; } #ifdef TESTING #include <stdio.h> void TestStrings(void) { char str1[] = "Frédéric"; char dest[sizeof(str1)/sizeof(str1[0])]; size_t res1 = str_remove_chars(dest, str1, "r"); size_t res2 = str_remove_chars(str1, str1, "é"); printf("dest = \"%s\" (%u chars).\n", dest, (unsigned int)res1); printf("str1 = \"%s\" (%u chars).\n", str1, (unsigned int)res2); } #endif
Moi j'allais proposer ce code (désolé j'étais oocupé ailleurs :lol:) :
Tu vois ED, cette fois j'ai pensé aux pointeurs :lol:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 #include <stdlib.h> #include <stdio.h> #include <string.h> int main (void) { char str [30] = { "Supprimer le #diese" }; char * pr = NULL; /* Pointeur de lecture. */ char * pw = NULL; /* Pointeur d'ecriture. */ printf ("%s\n", str); /* La chaine avant modifications. */ pr = strchr (str, '#'); /* Recherche du caractère a supprimer. */ if (pr != NULL) { /* * On place le pointeur d'ecriture a la meme adresse que * le pointeur de lecture pour commencer le decalage. */ pw = pr; while (*pr != 0) { pr++; /* On decale le pointeur de lecture d'une case. */ *pw = *pr; /* Ecriture du caractere courant a sa nouvelle adresse. */ pw++; /* On decale le pointeur d'ecriture d'une case. */ } } printf ("%s\n", str); /* La chaine apres modifications. */ return EXIT_SUCCESS; }
C'est vrai, j'aurais pu utiliser directement les pointeurs au lieu de mettre des index.
Mais ma fonction à moi retourne la nouvelle longueur de chaîne, na!
PS: J'ai bien dit longueur et non pas taille de la chaîne.
merci pour toutes vos reponses,
moi je lis les caractere d'un fichier et il faut que je supprime quelque caractere particulier,mon probleme mnt c'est que je sais pas comment modifier le texte du meme fichier,cad je supprime mon caractere et je decale la suite car mon fichier et en ecriture je peux pas l'ouvrir en lecture et en ecriture.
ce que je fais pour le moment c que j'ecris mon flux de caracetre qui reste dans un nouveau fichier ouvert en ecriture.
donc,y a pas une solution pour lire et ecrire a partir et dans le meme fichier?
Il fallait le dire plus tôt que tu voulais faire ça dans un fichier...Citation:
Envoyé par m@rki
Le principe est bien connu. Le fichier original A en lecture ("r"), un fichier de copie B en écriture ("w"). On copie les octets de A vers B avec une boucle fgetc() / fputc(), en repérant (comptant, comparant...) les caractères à ne pas copier. Quand c'est le cas, tout simplement, on omet de faire la copie et voila. Le caractère est supprimé. Quand c'est fini, on ferme les fichiers.Citation:
je cherche si il y a une fonction en C qui supprime un caractere d'une chaine donnee
Ou alors, si on ne veux pas créer un deuxième fichier, on l'ouvre en lecture seul pour charger le contenu dans un buffer, puis on le ferme. On réalise les modifications voulues en utilisant la fonction proposée par Médinoc ou Franck.H, puis on sauve dans le fichier ouvert en écriture.Citation:
Envoyé par Emmanuel Delahaye
Thierry
C'est beaucoup plus complexe, pas toujours possible (taille mémoire) et ne permet pas l'annulation...Citation:
Envoyé par mujigka