Bonjour, Je vous propose un nouvel élément à utiliser : Eliminer les espaces superflus
Cette fonction supprime les espaces superflus dans une chaîne de caractères.
Qu'en pensez-vous ?
Bonjour, Je vous propose un nouvel élément à utiliser : Eliminer les espaces superflus
Cette fonction supprime les espaces superflus dans une chaîne de caractères.
Qu'en pensez-vous ?
Bonjour,
Je la trouve bien mais peut etre un peu longue ??
Pourquoi pas :
Qu'en pensez vous ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include <stdlib.h> #include <stdio.h> #include <string.h> char *epur(char *str) { char *res = NULL; int i; int y; y = 0; res = malloc((strlen(str) + 1) * sizeof(char)); /* malloc de la taille initiale + 1 pour le '\0' */ if (res == NULL) return (NULL); for (i = 0; str[i] == ' ' && str[i]; i++); /* saut des espaces au debut */ for (; str[i]; i++) { /* Si c'est un mot on l'ajoute dans notre nouvelle chaine */ if (str[i] != ' ') { res[y] = str[i]; y++; } else if (str[i] == ' ' && str[i + 1] != ' ' && str[i]) /* Sinon, si c'est un espace et que le prochain caractere n'est pas un espace (donc un mot) on ajoute un espace pour separer les mots (verification si on est pas en fin de chaine avec str[i]) */ { res[y] = ' '; y++; } } res[y] = 0; /* Ajout du '\0' de fin de chaine */ res = realloc(res, y); /* realloc de la taille reelle */ return (res); }
Quelques commentaires :
-1le second test est inutile : si str[i] == ' ' alors str[i] != 0
Code : Sélectionner tout - Visualiser dans une fenêtre à part for (i = 0; str[i] == ' ' && str[i]; i++);
-2str[i] est toujours dans le else égal à ' ' (et donc aussi != 0 ce qui de plus était déjà testé dans le for englobant)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 for (; str[i]; i++) { if (str[i] != ' ') .... else if (str[i] == ' ' && str[i + 1] != ' ' && str[i])
-3 Erreur dans le realloc() :
Le realloc doit aussi être fait par la procédure utilisée par fearyourself
Code : Sélectionner tout - Visualiser dans une fenêtre à part res = realloc(res, y+1);
-4 Ne traite pas correctement les blancs en queue de chaine (en laisse un)
-----------------------------------
Une version qui fait la chose sur place en modifiant la chaine d'origine :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 void epur(char* chaine) { int blanc = 1; char* lire = chaine; char* ecrire = chaine; while(*lire != '\0') { if(*lire != ' ' || !blanc)*ecrire++ = *lire; blanc = *lire ==' '; lire++; } if(blanc && ecrire != chaine) ecrire--; *ecrire = '\0'; }
Publication : Concepts en C
Mon avatar : Glenn Gould
--------------------------------------------------------------------------
Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
Bonjour,
Merci pour tes remarques :
1- Oui c'est vrai, faute d'inatention voila ce que c'est de coder trop vite sans tout verifier =)
2- comment ca "str[i] est toujours dans le else égal à ' '" si str[i] est une lettre il rentre dans le premier if ?? (et pour les str[i] != 0 je voulai ecrire str[i + 1], ce qui nous enleve le probleme 4)
3- au temps pour moi j'ai pas l'habitude des realloc =)
4- Probleme reglee au 2-
Et merci pour les commentaires.
Sinon je viens de tester mon code marche donc bien avec le str[i + 1] et en corigeant le realloc.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 char *epur(char *str) { char *res; int i; int y; y = 0; res = malloc((strlen(str) + 1) * sizeof(char)); if (res == NULL) return (NULL); for (i = 0; str[i] == ' ' && str[i]; i++); for (; str[i]; i++) { if (str[i] != ' ') { res[y] = str[i]; y++; } else if (str[i] == ' ' && str[i + 1] != ' ' && str[i + 1]) { res[y] = ' '; y++; } } res[y] = 0; return (res); }
Mes 2 centimes:
- diogene, je ne comprends pas ton || &&, il manque peut-être des parenthèses (et même, le != ' ' && == ' ' s'annule non ?)
- cyberboss le else du str[i] != ' ' implique forcément que str[i] == ' '
Allez, à moi, à moi:
PS: c'est néanmoins marrant de voir les différents styles ;D
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #include <string.h> #include <stdlib.h> char *epur(const char *s) { char *new, *p; if (!s || !(new = p = strdup(s))) return NULL; for (; *s; ++s) { /* on a un caractère non-blanc, ou alors le prochain l'est (et on n'est pas au debut) */ if (*s != ' ' || (*(s+1) && *(s+1) != ' ' && p != new)) *(p++) = *s; } *p = '\0'; /* on pourrait très bien ici faire `return new;` */ if ((p = realloc(new, p+1-new))) new = p; return new; }
1)Avant de poster, merci de lire les règles. 2)Utiliser [code] [/code] pour quoter le code ! 3)Conseils pour le forum C [a lire en entier!]
Non, dans l'exemple de diogene, les deux tests ne s'annulent pas. && est prioritaire sur || ainsi
est équivalent à
Code : Sélectionner tout - Visualiser dans une fenêtre à part if(*lire != ' ' || !blanc && *lire == ' ')
Personnellement, même si ça reste simple à lire dans un tel cas, j'aurais plutôt tendance à mettre les parenthèses.
Code : Sélectionner tout - Visualiser dans une fenêtre à part if(*lire != ' ' || (!blanc && *lire == ' '))
Du coup ça revient à (et ce que j'entendais par s'annulent, et j'avoue que "simplifient" aurait été plus approprié):
Code : Sélectionner tout - Visualiser dans une fenêtre à part if (*lire != ' ' || !lblanc)
1)Avant de poster, merci de lire les règles. 2)Utiliser [code] [/code] pour quoter le code ! 3)Conseils pour le forum C [a lire en entier!]
Vous avez raison
Je modifie mon post en conséquence.
Publication : Concepts en C
Mon avatar : Glenn Gould
--------------------------------------------------------------------------
Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager