fonction manipulant une string
Bonjour, je désire me faire une fonction qui "supprime" tous les espaces contenus dans la string. Donc si j'ai une string "1 2 3 4 5" ma sortie doit être "12345". Mais j'ai un segmentation fault et je ne comprends pas pourquoi. Je vous envoie ma fonction :
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
|
#include<stdlib.h>
#include<stdio.h>
#include<ctype.h>
#include<string.h>
void DeleteAllSpaces(char * s)
{
unsigned int i,j;
for(i=0;i<strlen(s);++i)
{
if(isspace(s[i]))
{
for(j=i;j<strlen(s);++j)
s[j]=s[j+1];
s[strlen(s)-1]='\0';
}
}
}
int main()
{
char * s="1 2 3 4 5 6";
DeleteAllSpaces(s);
printf("s =%s\n",s);
return 0;
} |
Mon algo est pourtant ultra simple (mais pas du tout optimisé !). Pouvez-vous m'expliquer mon erreur s'il vous plait ? Merci.
Re: fonction manipulant une string
Citation:
Envoyé par salseropom
Bonjour, je désire me faire une fonction qui "supprime" tous les espaces contenus dans la string.
http://emmanuel-delahaye.developpez.com/clib.htm
Module STR
Fonction STR_DelBlanks()
Evidemment, la chaine d'origine doit être modifiable, ce qui n'est las le cas d'une chaine littérale...
Citation:
Code:
char * s="1 2 3 4 5 6";
Non !
Code:
char s[]="1 2 3 4 5 6";
Re: fonction manipulant une string
Citation:
Envoyé par salseropom
Mon algo est pourtant ultra simple (mais pas du tout optimisé !).
Il tout sauf simple et il est surtout très faux...
Ca, c'est simple. Je ne sais pas si c'est optimisé, mais je m'en tamponne...
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
|
#include<stdio.h>
#include<ctype.h>
#include<string.h>
void DeleteAllSpaces(char * s)
{
size_t const n = strlen(s);
size_t r = 0;
size_t w = 0;
while (r < n)
{
if (!isspace(s[r]))
{
s[w] = s[r];
w++;
}
r++;
}
s[w] = 0;
}
int main(void)
{
char s[] = " 1 2 3 4 5 6 ";
printf("s = '%s'\n", s);
DeleteAllSpaces(s);
printf("s = '%s'\n", s);
return 0;
} |
Code:
1 2 3
|
s = ' 1 2 3 4 5 6 '
s = '123456' |
Re: fonction manipulant une string
Citation:
Envoyé par Emmanuel Delahaye
Ca, c'est simple. Je ne sais pas si c'est optimisé, mais je m'en tamponne...
Ce n'est pas tres optimise, en effet. En regle general, on peut considerer qu'appeler strlen() avant de boucler sur les elements d'une chaine est peu optimise (il est fort probable que strlen() boucle elle-meme a la recherche du terminateur '\0').
En fait, on n'a pas besoin de connaitre la longueur de la chaine:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
#include<ctype.h>
void delete_spaces(char *s)
{
char *w = s;
while(*s)
{
if(!isspace(*s))
{
*w = *s;
w++;
}
s++;
}
*w = '\0';
} |
Re: fonction manipulant une string
Citation:
Envoyé par DaZumba
Citation:
Envoyé par Emmanuel Delahaye
Ca, c'est simple. Je ne sais pas si c'est optimisé, mais je m'en tamponne...
Ce n'est pas tres optimise, en effet.
Exact.
Ca me rappelle quelquechose :
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
|
/* ---------------------------------------------------------------------
STR_DelBlanks()
---------------------------------------------------------------------
Suppression des blancs dans une chaine
LA CHAINE EST MODIFIEE !!!
---------------------------------------------------------------------
E : Chaine initiale
S :
--------------------------------------------------------------------- */
void STR_DelBlanks (char *const s)
{
ENUM_CHECK ();
if (s && *s)
{
char const *pr = s;
char *pw = s;
while (*pr)
{
if (*pr != ' ')
{
*pw = *pr;
pw++;
}
pr++;
}
*pw = 0;
}
} |
Hé hé.
Re: fonction manipulant une string
Citation:
Envoyé par Emmanuel Delahaye
Ca me rappelle quelquechose:
Oh, je ne pretendais pas soumettre une implementation entierement nouvelle :)
Mais j'ai pas copie, promis!
Re: fonction manipulant une string
Citation:
Envoyé par DaZumba
Citation:
Envoyé par Emmanuel Delahaye
Ca me rappelle quelquechose:
Oh, je ne pretendais pas soumettre une implementation entierement nouvelle :)
Mais j'ai pas copie, promis!
Attention vous deux, sinon je divise votre note par deux et ça sera bien fait... :wink:
Re: fonction manipulant une string
Citation:
Envoyé par fearyourself
Citation:
Envoyé par DaZumba
Citation:
Envoyé par Emmanuel Delahaye
Ca me rappelle quelquechose:
Oh, je ne pretendais pas soumettre une implementation entierement nouvelle :)
Mais j'ai pas copie, promis!
Attention vous deux, sinon je divise votre note par deux et ça sera bien fait... :wink:
T'awar ta gueule à la récrée!