GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: scott1 le 14 Janvier 2011, 13:09:03

Titre: Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: scott1 le 14 Janvier 2011, 13:09:03
Bonjour à toutes et à tous,

dans le but d'un système, ou j'utilise PHP/MySQL/pwn,

j'ai remarqué que le php/html/css etait plus intelligent que le pwn.

En effet quand la ligne est trop longue, il fait un saut de ligne a la place du dernier espace pour rester dans le cadre du thème.

malheureusement, je remarque que pawno est moins intelligent, donc dans mon dialog, il ne me rétrécira jamais les lignes.

J'aimerais donc savoir comment faire pour qu'a partir du moment ou il y a trop de caractère et que le dialogue est trop large, il me le coupe automatiquement a l'espace précédent avec un \n.


merci d'avance.

j'espère que vous m'avez compris :D
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: Gilux le 14 Janvier 2011, 14:29:45
C'est juste une idée mais tu peux utiliser la fonction strlen de PHP : http://fr2.php.net/strlen (http://fr2.php.net/strlen) pour connaître la longueur d'une chaîne de caractères  ;)
++
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: scott1 le 14 Janvier 2011, 16:50:21
la je parle en pwn, mais si j'utilise ça, je risque de tomber dans un mot et le couper s'est pas pas beau
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: chneubeul le 14 Janvier 2011, 17:05:16
Salut,

Le pawno n'est pas moins intelligent ou '' moins " performant qu'un autre code. C'est juste que ces possibilités sont moindres, mais tu peut créé une fonction qui va te permettre de couper et sauvegarder une chaine de caractères via du code qui relève du C/C++
Déjà, il faut faire une boucle qui va repère les espaces et en même temps vérifier si il existe un autre espace après, ou si la chaine dépasse 128 caractères, si on est dans ce cas, alors on va venir couper à cette espace donc on relèveras a quel bit est l'espace pour la sauvegarde et l'envoie de la seconde chaine.

A+, Sam.
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: scott1 le 14 Janvier 2011, 20:37:15
Arf je connais pas le c/c++ :D

merci quand même, maintenant je sais que je doit utilisez un plugin.
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: chneubeul le 14 Janvier 2011, 21:15:28
Non, du tout.. >.< Le pawno est une variante du C/C++ simplifiez, certes mais ça y ressemble vachement. J'essayerais de faire une petite fonction, grâce à l'aide de Syg, qui m'avait déjà filer un coup de main à ce sujet. Mais là fonction qu'il m'avait fait filer ne traiter pas certain cas.
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: Ssk le 14 Janvier 2011, 21:37:51
Ce n'est pas le pawn qui n'est pas intelligent, c'est sa-mp qui ne préfère pas gérer ça ^^
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: scott1 le 15 Janvier 2011, 01:54:19
Je suis pas plus intelligent xD, je ne sais pas comment faire xD
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: chneubeul le 15 Janvier 2011, 06:14:35
Salut, je te propose un petit exercice. Essaye de le faire en recherchant des bouts de code et j'te dirais tes erreurs, et te donnerais une correction. Mais essaye franchement, au pire essaye de marquer comment tu pense faire le code en francais genre :

si a supérieur à x etc..
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: scott1 le 15 Janvier 2011, 17:19:36
Merci pour ton aide.

Dans un premier temps, je pensait à ça,

new longueur=strlen(mastring);
if(longueur > 256)
{
    strins(mastring, "\n", longueur/2,3);
}

Mais bon pas très esthétique, et peut être pas fonctionnel. et ça ne coupe pas pas forcement aux espace.

Le mieux je pense serais de faire une boucle qui vérifie tout les caractère pour voir si il y a des espaces.
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: Xartrick le 15 Janvier 2011, 21:34:02
J'ai fais un petit code que je pense être l'une des meilleurs solutions pour ton problème.

Citation de: Chaine
12347 215431 comment vas tu comment vas tu comment vas tu comment vas tu comment vas tu comment vas tu comment donc rahahalet nez
Citation de: Résultat
12347 215431 comment vas tu comment vas tu comment vas tu comment vas tu comment vas tu comment vas tu comment donc rahahalet STOP nez

SAMPStringLimiter(string[])
{
new stringlength = 0, sentencelength = 0, wordlength = 0;

stringlength = strlen(string); // Récupération de la taille de la phrase

for(new i = 0; i < stringlength; i++) // Boucle sur tous les caractères de la phrase
{
   if(string[i] == 32) // Espace
   {
if((sentencelength + wordlength) > 128) // Prédiction pour s'aretter
{
   print("STOP !");
}
       
       wordlength = 0; // Remet la taille du mot courrant à zéro
}
else
{
wordlength++; // Incrémentation de la taille du mot
   }
   
   sentencelength++; // Incrémentation de la taille de la phrase
}
}
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: scott1 le 15 Janvier 2011, 22:55:58
Merci Xatrick, mais pourrait tu m'expliquer comment utiliser? Car je seche :s
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: Xartrick le 15 Janvier 2011, 23:23:53
Pour l'instant, ce code est obsolète mais il pourrait te mener sur la voie ;).

Tu as juste à l'utiliser en lui fournissant la chaîne à couper.


SAMPStringLimiter("12347 215431 comment vas tu comment vas tu comment vas tu comment vas tu comment vas tu comment vas tu comment donc rahahalet nez");
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: scott1 le 15 Janvier 2011, 23:59:52
Je doit faire mon

strins
mais je sais pas a quelle position démarrer :s
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: Xartrick le 16 Janvier 2011, 00:05:01
Je t'ai fais une include, peut-être que cela te parleras plus.

Code: (x_textsplit.inc) [Sélectionner]
/*  Text Splitting for long text
 *
 *  (c) Copyleft 2011-2012, Xartrick
 *  This work is submitted under Beerware rights.
 *
 *  By Xartrick
 */


#if defined _x_textsplit_included
#endinput
#endif


#define _x_textsplit_included
#pragma library textsplit


#include <a_samp>


forward SAMPStringLimiter(string[]);
forward split(strsrc[], strdest[][], delimiter);


SAMPStringLimiter(string[])
{
new stringlength = 0, sentencelength = 0, wordlength = 0;
new sentence[2][128];

stringlength = strlen(string);

for(new i = 0; i < stringlength; i++)
{
    if(string[i] == 32)
    {
if((sentencelength + wordlength) > 128)
{
    string[i] = '£';
break;
}
       
        wordlength = 0;
}
else
{
wordlength++;
    }
   
    sentencelength++;
}

split(string, sentence, '£');

return sentence;
}

split(strsrc[], strdest[][], delimiter)
{
    new i = 0, li = 0, aNum = 0, len = 0;
   
    while(i <= strlen(strsrc))
    {
        if(strsrc[i] == delimiter || i == strlen(strsrc))
        {
            len = strmid(strdest[aNum], strsrc, li, i, 128);
            strdest[aNum][len] = 0;
            li = i+1;
            aNum++;
        }
       
        i++;
    }
    return 1;
}

À placer dans /pawno/include/ (par défaut).

Exemple d'utilisation:


Code: (Pawn) [Sélectionner]
new chaine[BIG_ARRAY] = "Ceci est un simple texte pour comprendre comme mon (Xartrick) include fonctionne, elle permet de couper un texte en deux parties (seulement) si celui-ci est trop long (128 caractères).";
new result[2][128];

result = SAMPStringLimiter(chaine);

printf("%s", result[0]);
printf("%s", result[1]);
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: scott1 le 16 Janvier 2011, 01:01:24
Repondre, merci a toi !, je n'ai plus qu'a trouver comment mettee mes \n.

Tout grand merci
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: Xartrick le 16 Janvier 2011, 01:02:22
Quel usage veut-tu faire de ceci ?

Une personne envoi un message et tu le coupe en deux phrases si celle-ci est trop longue ?
Titre: Re : Comment faire pour emplacer certain espace par des saut de ligne.
Posté par: scott1 le 16 Janvier 2011, 01:52:51
S'est pour mon dialogue, j'aimerais que si le message est superieu a 128, qu'il me mette un "
 " a l'espace le plus proche, pour éviter que mon tableau ne soit trop large et ne sorte de l'écran.

Double post
Salut, donc j'ai utilisé ton code mais je l'ai modifier.


SAMPStringLimiter(string[])
{
new stringlength = 0, sentencelength = 0, wordlength = 0;

stringlength = strlen(string);

new string2[1024];
strmid(string2, string, 0, 1024, 1024);

printf(string);

for(new i = 0; i < stringlength; i++)
{
    printf(string);
    printf(string[i]);
    if(string[i] == 32)
    {
if((sentencelength + wordlength) > 128)
{
    strins(string2, "\n", i,1024);
    sentencelength = 0;
}

        wordlength = 0;
}
else
{
wordlength++;
    }

    sentencelength++;
}

    printf(string);

return string2;
}

le soucis s'est que je suis obliger d'utiliser une autre string

new string2[1024];
strmid(string2, string, 0, 1024, 1024);

Car avec mes

printf(string);
    printf(string[i]);

je vois que le premier me donne toute la ligne, le second, la ligne moin la lettre qui se trouve en i et ce qu'il y a avant

et que donc a mon return string, j'obtien un blanc.

Est il possible de faire autrement pour ne pa devoir utiliser 2 string?

merci !