Couper des lignes qui ne contiennent aucun espace ?
12 réponses
Nicolas Cavigneaux
Bonjour tout le monde,
je suis entrain d'écrire une petite fonction qui coupe les lignes trop
longues en plusieurs lignes (un wrapper donc ...). Je ne compte pas
révolutionner ce qui existe déjà, c'est juste pour apprendre à le
faire. Pour progresser. Ma fonction fonctionne plutôt bien, elle sait
très bien couper lignes qui contiennent un espace ou une tabulation
lorsqu'il se trouve à un numéro de colonne étant un multiple de la
longueur maximale que j'ai fixée. Elle sait également couper les lignes
avec des mots très long en revenant au dernier caractère non-visible
disponible. La seule fonctionnalité manquante est de pouvoir couper les
lignes très longues sans espace. Donc en la découpant en "n" parties de
longueur maximale MAX (MAX étant la longueur maximale fixée pour une
ligne).
Voici donc le code qui me permet de faire mes test, je préfère le copier
en entier pour être sûr de ne pas avoir loupé un détail ailleurs que
dans la partie qui nous intéresse pour le découpage des longues lignes
sans espace.
#define MAX 1000 /* max line length on input */
#define FOLD 72 /* max line length for folding */
#define IN 1 /* we are in a word */
#define OUT 0 /* we are not in a word */
void fold(char string[])
{
char new_string[MAX];
int i = 0, j = 0, pos = 0, current = 0, state = 0;
while (current <= (int) strlen(string))
{
/* looking if we are in a word or not */
if (string[current] == ' ' || string[current] == '\t')
state = OUT;
else
state = IN;
/* is there enough characters or not ? */
if (pos / FOLD < 1)
{
new_string[i++] = string[current++];
pos++;
}
else
{
/* We are not in a word so we can fold the line */
if (state == OUT)
{
new_string[i++] = '\n';
new_string[i++] = string[current++];
}
/* We are in a word, we have to go back to the last invisible character */
else
{
for (j = i; new_string[j] != ' ' && new_string[j] != '\t' && new_string[j] != '\n' && j > 0; j--);
/* The line has no invisible character */
if (j == 0 || new_string[j] == '\n')
{
/* BUG */
while (j < i)
{
if (j % FOLD == 0 && j != 0)
{
memmove(new_string+j+1, new_string+j, MAX-j-1);
new_string[j++] = '\n';
}
j++;
}
}
/* There is an invisible character where we can insert a '\n' */
else
new_string[j] = '\n';
}
pos = 0;
}
}
strcpy(string, new_string);
}
J'ai essayer avec toute sorte de modifications sans succès, je n'arrive
pas à comprendre pourquoi les lignes sans espace de plus de 72
caractères sont, après le passage dans ma fonction, affichée jusqu'au
72ème caractère, avec le retour à ligne puis plus rien alors que le
reste de la chaîne devrait s'afficher à la ligne suivante ...
Merci pour vos conseils et votre aide.
--
Nicolas Cavigneaux | GPG KeyID : F0954C41
bounga@altern.org | http://bounga.ath.cx
"Alexandre BACQUART" a écrit dans le message de news:40e5f595$0$24429$
tu vas chercher des heures ce bug monstrueux qui n'existe en fait pas du tout pour finallement jurer comme un chartier "c'est cette boudiou de pile !!!". Ce jour là, l'espace de la pile désormais tu respecteras :)
Ça sent la vécu, là ! ;)
"Alexandre BACQUART" <tek512@hotmail.com> a écrit dans le message de
news:40e5f595$0$24429$636a15ce@news.free.fr...
tu vas chercher des heures ce bug monstrueux qui
n'existe en fait pas du tout pour finallement jurer comme un chartier
"c'est cette boudiou de pile !!!". Ce jour là, l'espace de la pile
désormais tu respecteras :)
"Alexandre BACQUART" a écrit dans le message de news:40e5f595$0$24429$
tu vas chercher des heures ce bug monstrueux qui n'existe en fait pas du tout pour finallement jurer comme un chartier "c'est cette boudiou de pile !!!". Ce jour là, l'espace de la pile désormais tu respecteras :)
Ça sent la vécu, là ! ;)
Alexandre BACQUART
Jean-Noël Mégoz wrote:
"Alexandre BACQUART" a écrit dans le message de news:40e5f595$0$24429$
tu vas chercher des heures ce bug monstrueux qui n'existe en fait pas du tout pour finallement jurer comme un chartier "c'est cette boudiou de pile !!!". Ce jour là, l'espace de la pile désormais tu respecteras :)
Ça sent la vécu, là ! ;)
Il faut préciser quand-même que c'était une autre époque. Aujourd'hui, les stack-overflow sont souvent détectés par le système, même si le message ne sera qu'un "pagefault", ça peut déjà mettre la puce à l'oreille.
... en viendra à bout en quelques millisecondes, et zou : pagefault ! Ca peut même aller encore plus vite avec des paramètres (qui bouffent encore plus de pile à chaque appel) et avec des variables automatiques genre char[1024], la survie du programme se compte en microsecondes :)
Un bon compilateur pourraît détecter cet exemple trivial et émettre un warning. Quelques mineures modifications et il sera bluffé. Dans la pratique et dans de gros programmes, un stack-overflow ne se résoud en général qu'en augmentant la taille de la pile (ça doit pouvoir se régler dans le linker) et si ce n'est pas possible, il se peut qu'il faille tout revoir !
-- Tek
Jean-Noël Mégoz wrote:
"Alexandre BACQUART" <tek512@hotmail.com> a écrit dans le message de
news:40e5f595$0$24429$636a15ce@news.free.fr...
tu vas chercher des heures ce bug monstrueux qui
n'existe en fait pas du tout pour finallement jurer comme un chartier
"c'est cette boudiou de pile !!!". Ce jour là, l'espace de la pile
désormais tu respecteras :)
Ça sent la vécu, là ! ;)
Il faut préciser quand-même que c'était une autre époque. Aujourd'hui,
les stack-overflow sont souvent détectés par le système, même si le
message ne sera qu'un "pagefault", ça peut déjà mettre la puce à l'oreille.
... en viendra à bout en quelques millisecondes, et zou : pagefault ! Ca
peut même aller encore plus vite avec des paramètres (qui bouffent
encore plus de pile à chaque appel) et avec des variables automatiques
genre char[1024], la survie du programme se compte en microsecondes :)
Un bon compilateur pourraît détecter cet exemple trivial et émettre un
warning. Quelques mineures modifications et il sera bluffé. Dans la
pratique et dans de gros programmes, un stack-overflow ne se résoud en
général qu'en augmentant la taille de la pile (ça doit pouvoir se régler
dans le linker) et si ce n'est pas possible, il se peut qu'il faille
tout revoir !
"Alexandre BACQUART" a écrit dans le message de news:40e5f595$0$24429$
tu vas chercher des heures ce bug monstrueux qui n'existe en fait pas du tout pour finallement jurer comme un chartier "c'est cette boudiou de pile !!!". Ce jour là, l'espace de la pile désormais tu respecteras :)
Ça sent la vécu, là ! ;)
Il faut préciser quand-même que c'était une autre époque. Aujourd'hui, les stack-overflow sont souvent détectés par le système, même si le message ne sera qu'un "pagefault", ça peut déjà mettre la puce à l'oreille.
... en viendra à bout en quelques millisecondes, et zou : pagefault ! Ca peut même aller encore plus vite avec des paramètres (qui bouffent encore plus de pile à chaque appel) et avec des variables automatiques genre char[1024], la survie du programme se compte en microsecondes :)
Un bon compilateur pourraît détecter cet exemple trivial et émettre un warning. Quelques mineures modifications et il sera bluffé. Dans la pratique et dans de gros programmes, un stack-overflow ne se résoud en général qu'en augmentant la taille de la pile (ça doit pouvoir se régler dans le linker) et si ce n'est pas possible, il se peut qu'il faille tout revoir !