0
0
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 :
#include
#include
#include
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 == ' ' && str; i++);
/* saut des espaces au debut */
for (; str; i++)
{
/* Si c'est un mot on l'ajoute dans notre nouvelle chaine */
if (str != ' ')
{
res = str;
y++;
}
else if (str == ' ' && str[i + 1] != ' ' && str)
/* 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) */
{
res = ' ';
y++;
}
}
res = 0; /* Ajout du '\0' de fin de chaine */
res = realloc(res, y); /* realloc de la taille reelle */
return (res);
}
Qu'en pensez vous ?
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 est toujours dans le else égal à ' '" si str est une lettre il rentre dans le premier if ?? (et pour les str != 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.
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 == ' ' && str; i++);
for (; str; i++)
{
if (str != ' ')
{
res = str;
y++;
}
else if (str == ' ' && str[i + 1] != ' ' && str[i + 1])
{
res = ' ';
y++;
}
}
res = 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 != ' ' implique forcément que str == ' '
Allez, à moi, à moi:
#include
#include
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;
}
PS: c'est néanmoins marrant de voir les différents styles ;D
| Code : | Sélectionner tout |
if(*lire != ' ' || !blanc && *lire == ' ')
| Code : | Sélectionner tout |
if(*lire != ' ' || (!blanc && *lire == ' '))
| Code : | Sélectionner tout |
if (*lire != ' ' || !lblanc)
Je modifie mon post en conséquence.
