| 
				
				Форматирование
				 |   |  
| 
хвостег
 | 
Дата: Вторник, 04.11.2014, 17:00:12 | Сообщение # 1 |  
  
  |  
Сообщений: 161
 
Репутация: 53 [ +/- ]
 |   
 | 
Почему я не могу запртинтить такое? 
   Код    PrintToChat(client, "Test: %s", "%s %s");      
   В чат выводит Test:, а мне надо Test: %s %s 
   Как бороться с этим? 
   Можно конечно всунуть символ, который не будет виден, между % и s, но в "чатовой" строке каждый байт на счету! как обойтись без лишних символов? 
 
 Сообщение отредактировал хвостег - Вторник, 04.11.2014, 17:10:57  | 
 
|   | 
 |    |  
| 
king(rus)
 | 
Дата: Вторник, 04.11.2014, 17:13:32 | Сообщение # 2 |  
  
  |  
Сообщений: 109
 
Репутация: 2 [ +/- ]
 |   
 | 
Цитата хвостег (  )     В чат выводит Test:, а мне надо Test: %s %s 
   Как бороться с этим? 
   Можно конечно всунуть символ, который не будет виден, между % и s, но в "чатовой" строке каждый байт на счету! как обойтись без лишних символов? 
      
   Ахах, а как ты думаешь? Читай мануал PrintToChat   Код Syntax:   native PrintToChat(client, const String:format[], any:...); 
   Usage:       client  Client index.       format  Formatting rules.       ...   Variable number of format parameter.  
 
 Сообщение отредактировал king(rus) - Вторник, 04.11.2014, 17:14:38  | 
 
|   | 
 |    |  
| 
хвостег
 | 
Дата: Вторник, 04.11.2014, 17:21:16 | Сообщение # 3 |  
  
  |  
Сообщений: 161
 
Репутация: 53 [ +/- ]
 |   
 | 
не думай что я идиот.   Код    public OnPluginStart()   {     RegConsoleCmd("sm_asd", CMD_ASD);   } 
   public Action:CMD_ASD(client, args)   {     print(client, "Test: %s", "%s %s");   } 
   stock print(client, String:format[], any:...)   {     decl String:Compile[253];     VFormat(Compile, sizeof(Compile), format, 3);           PrintString(Compile, strlen(Compile));           new Handle:bf = StartMessageOne("SayText2", client, USERMSG_RELIABLE|USERMSG_BLOCKHOOKS);     if(bf != INVALID_HANDLE)     {      BfWriteByte(bf, 0);      BfWriteByte(bf, false);      BfWriteString(bf, Compile);      EndMessage();     }   } 
   stock PrintString(String:text[], len)   {     new byte;     for(new i = 0; i < len; i++)     {      byte = text[i] & 0xFF;      PrintToServer("Char [%c]", byte);     }   }      
   так тоже не принтит. ПОЧЕМУ? 
 
 Сообщение отредактировал хвостег - Вторник, 04.11.2014, 17:21:28  | 
 
|   | 
 |    |  
| 
Sallcom
 | 
Дата: Вторник, 04.11.2014, 17:26:27 | Сообщение # 4 |  
  
  |  
Сообщений: 205
 
Репутация: 31 [ +/- ]
 |   
 | 
Цитата хвостег (  )  В чат выводит Test:, а мне надо Test: %s %s    
   Делай вот так:   Код    PrintToServer("Test %%s %%s");      
   Для вывода знака % нужно писать %% 
   http://world-source.ru/forum/100-2688-16537-16-1343178504 
 
 Сообщение отредактировал Sallcom - Вторник, 04.11.2014, 17:27:23  | 
 
|   | 
 |    |  
| 
хвостег
 | 
Дата: Вторник, 04.11.2014, 17:34:00 | Сообщение # 5 |  
  
  |  
Сообщений: 161
 
Репутация: 53 [ +/- ]
 |   
 | 
 да в сервер принтит хоть экранируй хоть нет, мне в чат надо, не работает такой подход.   еще идеи? 
 
 Сообщение отредактировал хвостег - Вторник, 04.11.2014, 17:34:32  | 
 
|   | 
 |    |  
| 
BarD
 | 
Дата: Вторник, 04.11.2014, 17:42:51 | Сообщение # 6 |  
  
  |  
Сообщений: 943
 
Репутация: 137 [ +/- ]
 |   
 | 
Код new String:a[1]="s";   PrintToChat(client, "%%%s %%%s", a, a);   
   Попробуй так) я не знаю) 
 
 Сообщение отредактировал BarD - Вторник, 04.11.2014, 17:43:27  | 
 
|   | 
 |    |  
| 
хвостег
 | 
Дата: Вторник, 04.11.2014, 17:50:50 | Сообщение # 7 |  
  
  |  
Сообщений: 161
 
Репутация: 53 [ +/- ]
 |   
 | 
Цитата BarD (  )  new String:a[1]="s";   PrintToChat(client, "%%%s %%%s", a, a);     Так же, ничего не принтит. 
 | 
 
|   | 
 |    |  
| 
BarD
 | 
Дата: Вторник, 04.11.2014, 18:08:52 | Сообщение # 8 |  
  
  |  
Сообщений: 943
 
Репутация: 137 [ +/- ]
 |   
 | 
Код new String:a[1]="%";   new String:b[1] = "s"; 
   PrintToChat(client, " %s%s %s%s", a, b, a, b);   
   Или так:   Код new String:a[2]="%%";   new String:b[1] = "s"; 
   PrintToChat(client, " %s%s %s%s", a, b, a, b);  
 | 
 
|   | 
 |    |  
| 
хвостег
 | 
Дата: Вторник, 04.11.2014, 18:13:30 | Сообщение # 9 |  
  
  |  
Сообщений: 161
 
Репутация: 53 [ +/- ]
 |   
 | 
даже если это заработает, мне нужно запринтить строку одним %s. как это сделано в 1 посте.   т.к я без понятия какие символы напишет клиент в чат, мне нужно их передать без потерь, а это   Цитата BarD (  )  " %s%s %s%s", a, b, a, b   - "городушки" какие-то   И последний вопрос.   Чем отличается стандартный (движковый) метод отображения сообщений от этого   Код    stock print(client, String:format[], any:...)   {    decl String:Compile[253];    VFormat(Compile, sizeof(Compile), format, 3);        new Handle:bf = StartMessageOne("SayText2", client);    if(bf != INVALID_HANDLE)    {     BfWriteByte(bf, 0);     BfWriteByte(bf, false);     BfWriteString(bf, Compile);     EndMessage();    }   }     
 
 Сообщение отредактировал хвостег - Вторник, 04.11.2014, 18:18:47  | 
 
|   | 
 |    |  
| 
BarD
 | 
Дата: Вторник, 04.11.2014, 18:22:49 | Сообщение # 10 |  
  
  |  
Сообщений: 943
 
Репутация: 137 [ +/- ]
 |   
 | 
 Даже и не знаю, как можно это провернуть... 
 | 
 
|   | 
 |    |  
| 
Sallcom
 | 
Дата: Вторник, 04.11.2014, 18:59:11 | Сообщение # 11 |  
  
  |  
Сообщений: 205
 
Репутация: 31 [ +/- ]
 |   
 | 
Код    PrintToChat(client, "Test: %%s");          
   Но два %%s не выводит вообще, только "Test: ", а дальше как будто ничего нет. 
 
| 
Гости не могут скачивать файлы
 |   
 
 Сообщение отредактировал Sallcom - Вторник, 04.11.2014, 19:00:59  | 
 
|   | 
 |    |  
| 
хвостег
 | 
Дата: Вторник, 04.11.2014, 19:05:17 | Сообщение # 12 |  
  
  |  
Сообщений: 161
 
Репутация: 53 [ +/- ]
 |   
 | 
Именно, я так понял чат процессор внутриигровой ругается.   Запринти с 2мя %s и обрати внимаение на сообщение в консоли (игровой)   Код    Bad format string in CLocalizeStringTable::ConstructString     
 | 
 
|   | 
 |    |  
| 
Sallcom
 | 
Дата: Вторник, 04.11.2014, 19:38:26 | Сообщение # 13 |  
  
  |  
Сообщений: 205
 
Репутация: 31 [ +/- ]
 |   
 | 
Вспомнив про знак неразрывного пробела, я начал гуглить его для разных языков и кодировок.   В конечном итоге остановился на 0xA0, но код   Код    PrintToChat(client, "Test: %%%ss", 0xA0);        Сначала выдавал "Test: % s", а сейчас и вовсе "Test: %�s". 
   Тогда я сделал вот так:   Код    PrintToChat(client, "Test: %%%ss", 0xA0&10);        И вывод стал таким, какой и нужен, то есть "Test: %s". 
   В конечном итоге, я аналогично добавил второй символ %s и все что мне вывело, это "Test: ", так что вывести "Test: %s %s" нереально. 
   P.S. Информация про данный символ http://www.fileformat.info/info/unicode/char/a0/index.htm 
 
 Сообщение отредактировал Sallcom - Вторник, 04.11.2014, 20:03:13  | 
 
|   | 
 |    |  
| 
хвостег
 | 
Дата: Вторник, 04.11.2014, 20:18:32 | Сообщение # 14 |  
  
  |  
Сообщений: 161
 
Репутация: 53 [ +/- ]
 |   
 | 
Это то, о чем я говорил в первом посте, можно добавить символ между % и s, так то оно и у меня работает 
   Код    public OnPluginStart()   {    RegConsoleCmd("sm_asd", CMD_ASD);   } 
   public Action:CMD_ASD(client, args)   {    print(client, "%s", "%s %s %s %s %s %s");   } 
   stock print(client, String:format[], any:...)   {    decl String:Compile[253];    VFormat(Compile, sizeof(Compile), format, 3);        ReplaceString(Compile, sizeof(Compile), "%s", "%\x1Cs")        new Handle:bf = StartMessageOne("SayText2", client);    if(bf != INVALID_HANDLE)    {     BfWriteByte(bf, 0);     BfWriteByte(bf, true);     BfWriteString(bf, Compile);     EndMessage();    }   }      
   но хотелось бы без лишних символов обойтись... 
 | 
 
|   | 
 |    |  
| 
BarD
 | 
Дата: Среда, 05.11.2014, 04:49:16 | Сообщение # 15 |  
  
  |  
Сообщений: 943
 
Репутация: 137 [ +/- ]
 |   
 | 
 R1KO сказал, можно попробовать "\%s". 
 
 Сообщение отредактировал BarD - Среда, 05.11.2014, 17:38:04  | 
 
|   | 
 |    |     
		
		
 
 |