Форматирование
| |
хвостег
|
Дата: Вторник, 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 |
|
| |
|