Téléchargé 3 fois
Vote des utilisateurs
0
0
Détails
Licence : Non renseignée
Mise en ligne le 1er décembre 2010
Plate-formes :
Linux, Mac, Windows
Langue : Français
Référencé dans
Navigation
Eliminer les espaces superflus
Eliminer les espaces superflus
Cette fonction supprime les espaces superflus dans une chaîne de caractères.
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 ?
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 ?
Je la trouve bien mais peut etre un peu longue ??
Pourquoi pas :
Code : | Sélectionner tout |
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); } |
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.
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 |
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
- 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:
Code : | Sélectionner tout |
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; } |
Non, dans l'exemple de diogene, les deux tests ne s'annulent pas. && est prioritaire sur || ainsi
est équivalent à
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 |
if(*lire != ' ' || !blanc && *lire == ' ')
Code : | Sélectionner tout |
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 |
if (*lire != ' ' || !lblanc)
Vous avez raison
Je modifie mon post en conséquence.
Je modifie mon post en conséquence.
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.