Portal SAMP
[Ajuda] Ajuda com String - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] Ajuda com String (/showthread.php?tid=3658)



Ajuda com String - Laura Clout - 01/06/2023

Eu gostaria de um código que mostrasse quando a palavra atingisse um número exato de caracteres, tipo 20, ai se o último caractere não for "_" ele pegaria a palavra incompleta (tipo: ARROZ BATA(acaba aqui)) e jogasse para a linha de baixo, ou como teste quero que apenas printe com ela de baixo, ai ficaria:
ARROZ 
BATATA

no lugar de: ARROZ BATA
TA

mas isso acontecesse apenas se não fosse um _ o último caractere.


RE: Ajuda com String - White_Blue - 01/06/2023

(01/06/2023 19:09)Laura Clout Escreveu: Eu gostaria de um código que mostrasse quando a palavra atingisse um número exato de caracteres, tipo 20, ai se o último caractere não for "_" ele pegaria a palavra incompleta (tipo: ARROZ BATA(acaba aqui)) e jogasse para a linha de baixo, ou como teste quero que apenas printe com ela de baixo, ai ficaria:
ARROZ 
BATATA

no lugar de: ARROZ BATA
TA

mas isso acontecesse apenas se não fosse um _ o último caractere.

Não entendi bem o que você quer fazer, mas com certeza as funções strlen e strins e strcat vão te ajudar.

strlen - Retorna o tamanho da string;
strins - Injeta caracteres em uma determinada posição da string;
strcat - Concatena duas strings.


RE: Ajuda com String - Laura Clout - 01/06/2023

Tipo: tenho 3 linhas no textdraw, cada uma cabe 10 caracteres, quero que faça assim: ver se o caracter 10 (30 divido por 3) é "_", se o último caracter foi um "_", ele não vai fazer nada, mas se o último for uma letra, quero que ele pegue a palavra que ela letra faz parte (tipo BATATA) e jogue para a linha de baixo, basicamente corte ela se estiver inacabada, para não ficar ARROZ BATA
TA, quero que fique ARROZ
BATATA
Então é basicamente pegar a palavra incompleta e jogar para baixo, pegar as letras antes de chegar no espaço.


RE: Ajuda com String - Carlos Victor - 01/06/2023

Poderia ser mais explicativa? Mostrando exemplos, ficaria mais fácil de te ajudar.


RE: Ajuda com String - Dr Editor - 02/06/2023

Código PHP:
stock CriarListaTD(const string[], const novaLinha[] = "\n")
{
    new 
listaNova[256];
    new 
len strlen(string);
    new 
tmpItem[25];
    new 
index strfind(string" "true);
    new 
nextIndex 0;
    new 
lastIndex 0;
    
    while(
index > -1)
    {
        
strmid(tmpItemstringlastIndexnextIndex 1);
        
        if(
tmpItem[0] != '\0' && tmpItem[1] != '\0')
        {
            
strcat(listaNovatmpItem);
            
strcat(listaNovanovaLinha);
        }
        
        
lastIndex nextIndex;
        
index strfind(string" "truenextIndex);
        
nextIndex index 1;
        
        if(
index == -1)
        {
            
strmid(tmpItemstringlastIndexlen);
            if(
tmpItem[0] != '\0' && tmpItem[1] != '\0')
            {
                
strcat(listaNovatmpItem);
            }
        }
    }
    return 
listaNova;


Como usar:
Código PHP:
new string[] = "arroz batata arroz_doce nozes";
printf(CriarListaTD(string"~n~")); 

Vai imprimir: arroz~n~batata~n~arroz_doce~n~nozes


RE: Ajuda com String - Laura Clout - 02/06/2023

(Frase Exemplo)
Eu queria andar de avião sem asas

(Frase na string do TextDraw que estou usando fica assim)
Eu queria andar d
avião

Eu queria que ela ficasse sem cortar palavras, sabe? verificar se a ultima letra foi um espaço, se não tiver sido um espaço a função olhar até quando foi o último espaço, tipo: Eu queria andar (espaço). ai iria jogar o "d" que ficou cortado para a outra textdraw, para não ficar cortado:

Eu queria andar
de avião


RE: Ajuda com String - Device-Black - 02/06/2023

Tente esse aqui, ele procura o espaço mais proximo do 20° caractere e insere o `~n~`
Código PHP:
TD_CutString(string[], count)
{
    static 
limit;
    
limit strlen(string) - 4;
    
    static 
a;
    for(
count1024+= count)
    {
        if(
limit) break;
        
        static 
b;
        for(
a0b--)
        {
            if(
string[b] == 32)
            {
                
strins(string"~n~"b);
                break;
            }
        }
    }




RE: Ajuda com String - Laura Clout - 02/06/2023

Como eu deveria usar isso? obrigada


RE: Ajuda com String - White_Blue - 03/06/2023

(02/06/2023 21:22)Laura Clout Escreveu: Como eu deveria usar isso? obrigada

O código que o Dr Editor mandou funciona, ao menos no console, não sei se na Textdraw irá funcionar como esperado, mas é provável que sim.

Exemplo de uso:
Código PHP:
public OnGameModeInit() {
    printf(CriarListaTD("Hello, World!")); // Imprime no console "Hello,~n~World!"
    return 1;
}

// Definição da função
stock CriarListaTD(const string[], novaLinha[] = "~n~") {
    new listaNova[256];
    new len strlen(string);
    new tmpItem[25];
    new index strfind(string" "true);
    new nextIndex 0;
    new lastIndex 0;

    while(index > -1) {
        strmid(tmpItemstringlastIndexnextIndex 1);

        if(tmpItem[0] != '\0' && tmpItem[1] != '\0') {
            strcat(listaNovatmpItem);
            strcat(listaNovanovaLinha);
        }

        lastIndex nextIndex;
        index strfind(string" "truenextIndex);
        nextIndex index 1;

        if(index == -1) {
            strmid(tmpItemstringlastIndexlen);
            if(tmpItem[0] != '\0' && tmpItem[1] != '\0') {
                strcat(listaNovatmpItem);
            }
        }
    }
    return listaNova;

Fiz algumas pequenas mudanças na função, como deixar o valor padrão da string "novaLinha" como "~n~"(Quebra de linhas de textdraws no SA-MP, que seria o equivalente ao \n) ao invés de \n(Equivalente da tabela ASCII[American Standard Code for Information Interchange] usada na linguagens C-LIKE como Pawn, significa new-line e quebra uma linha selecionada ocupando 1 byte na memória).

Código funcionando no console
[Imagem: DEyqFOP.png]

Lembrando que isso é manipulação de string avançada, e não creio que de fato haja a necessidade de fazer tal coisa sendo que é muito mais fácil quebrar a linha manualmente na Textdraw. Ao menos para mim não faz o menor sentido.

Tem literalmente o mesmo efeito sem a necessidade de fazer isso tudo:
Código PHP:
Textdraw TextDrawCreate(240.0580.0"Bem-vindo~n~ao~n~meu~n~servidor"); 

Mas suponho que você queira usar essa função como modo de aprendizado ou para algo mais específico.


RE: Ajuda com String - Laura Clout - 03/06/2023

Acho que vocês ainda não entenderam, eu só quero um código que se o caractere na posição 20 for " " ele não faça nada, mas se o caractere 20 for alguma letra ou número (qualquer coisa que não seja um espaço) ele separa da string, quero fazer isso para colocar em um textdraw de avisos e não ficar cortando as palavras, atualmente ela fica assim:

Arroz batata batata arr
oz

Queria que o código verificasse se a última letra (no caso do exemplo é um r) se ela é um espaço, se não for, ele procura o espaço anterior (que fica depois do a do último batata) para ficar assim:

Arroz batata batata
arroz

Não deixar ficar incompleto, ele corta na string