[Решено] Конкатенация строк

Puwok

Участник
Сообщения
37
Реакции
4
Приветствую. Подскажите есть ли конкатенация строк в SourceMod!?

Если да: Подскажите как оформить по коду на данном примере
C-подобный:
public Action OG(Handle timer)
{
    char szText[1024], IP[16];
  
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && i > 0)
        { 
            // Пример из PHP >
            if(i != MaxClients) $szText.= $ip. ':';else
                $szText.= $ip;
           // А ниже мне бы пример как в SourceMod нужно
        }
    }
  
    На выходе получаем szText = "127.0.0.1:178.113.242.42:83.24.133.11";
  
    Format(szQuery, sizeof(szQuery), "Некий запрос", ...);
    g_hDatabase.Query(SQL_Callback_CheckError, szQuery);
}

Хочется это сделать для того, чтобы не слать постоянно по > 20 запросов в DB
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #2
Подскажите есть ли конкатенация строк в SourceMod!?
Есть. Но она работает чисто на уровне компилятора. Конкатенировать можно только константные значения:
C-подобный:
"Hello world" ... " by Username"
Переменные конкатенировать - нельзя.

Можете сделать так:
C-подобный:
public Action OG(Handle timer)
{
    char szText[1024], IP[16];
 
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            GetClientIP(i, IP, sizeof(IP));

            Format(szText, sizeof(szText), "%s:%s", szText, IP);
        }
    }
 
    // На выходе получаем szText = "127.0.0.1:178.113.242.42:83.24.133.11";
 
    Format(szQuery, sizeof(szQuery), "Некий запрос", ...);
    g_hDatabase.Query(SQL_Callback_CheckError, szQuery);
}
Я правда не представляю, что это за запрос, в котором нельзя сделать IN(), и в котором надо строго через точку с запятой всё перечислить.
А если это инсерт... Там можно одним запросом несколько записей вставить.
 
Последнее редактирование:

Puwok

Участник
Сообщения
37
Реакции
4
Kruzya, попробовал так, правда пока с одним игроком, работает нормально. Осталось проверить когда кто ещё зайдёт. Ещё раз спасибо за помощь!

C-подобный:
public Action Timeleft(Handle timer)
{
    if(GetCurrentPlayers() == 0) return;
    
    char szQuery[256], szText[1024];
    
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i))
        {
            if(i != GetCurrentPlayers()) Format(szText, sizeof(szText), "%s('%s','%.2f',%i,%i,%i,%i,%i,'%.1f','%s',1),", szText, ...);
                else Format(szText, sizeof(szText), "%s('%s','%.2f',%i,%i,%i,%i,%i,'%.1f','%s',1);", szText, ...);
        }
    }

    Format(szQuery, sizeof(szQuery), "INSERT INTO `ebm_game_players` (`a`,`b`,`c`,`d`,`e`,`f`,`j`,`h`,`j`,`k`)VALUES %s", szText);
    g
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #4
Это что за имена колонок о_О
C-подобный:
if(i != GetCurrentPlayers())
Это не так работает.
Кол-во игроков может быть 5, к примеру, а последний занимаемый индекс - 29.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #5
Не проще ли всегда писать запятую, а после цикла просто изменить последний символ на ;
 

Puwok

Участник
Сообщения
37
Реакции
4
Это что за имена колонок о_О
C-подобный:
if(i != GetCurrentPlayers())
Это не так работает.
Кол-во игроков может быть 5, к примеру, а последний занимаемый индекс - 29.

Название колонок - это так прикол.

C-подобный:
public int GetCurrentPlayers() {
    int count;
    for (int i = 1; i <= MaxClients; i++) {
        if (IsClientInGame(i) && (!IsFakeClient(i))) {
            count++;
        }
    }
    return count;
}
Сообщения автоматически склеены:

Не проще ли всегда писать запятую, а после цикла просто изменить последний символ на ;

Можно пример в виде кодэ?
 

Puwok

Участник
Сообщения
37
Реакции
4
Format() возвращает кол-во записанных символов. Этим можно воспользоваться:
C-подобный:
// ...
for (...) {
    // ...
    iPos = Format(szBuffer, ...);
}

szBuffer[iPos-1] = ';';

C-подобный:
перед iPos int выставить? а szBuffer заменить на szText. ?
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #9
Переменная должна быть заранее где-то объявлена.
Это не PHP. Здесь как только код выйдет за пределы фигурных скобок, переменная перестанет существовать. Потому объявляем в самом начале функции, как и строки.
 
Сверху Снизу