我想在C ++中创建命令/kick playername reason
,所以我尝试了它:
if (IPlayer.IsOnline() && IPlayer.GetAdmin() >= 3
&& sscanf(command, "/kick %[a-z | A-Z | 0-9/<>|.,~*;`:!'^+%&/()=?_-£#${[]}€] %[a-z | A-Z | 0-9/<>|.,~*;`:!'^+%&/()=?_-£#${[]}€]",
&playername, &reasonkick) == 2)
但是当我在游戏中使用命令时,什么也没有发生。语法错误吗?
sscanf()
不支持正则表达式。您使用%[]
占位符的方式确实是错误的语法。请尝试以下方法:
sscanf(command, "/kick %N[^ ] %Ms", playername, reasonkick)
其中N
和M
分别是playername
和reasonkick
缓冲区的最大宽度。 %N[^ ]
将扫描输入字符串,直到遇到空格字符或已扫描N
字符为止。无需指定可能遇到的所有单个字符。 %Ms
将扫描输入字符串的其余部分,直到到达字符串的结尾或直到已扫描M
字符为止。如果需要,可以将%M[^ ]
用作该参数。
但是,在C ++中,最好使用std::istringstream
和std::getline()
代替sscanf()
,例如:
std::istringstream iss(command);
std::string cmd;
std::getline(iss, cmd, ' ');
if (cmd == "/kick")
{
std::string playername, reasonkick;
std::getline(iss >> std::ws, playername, ' ');
std::getline(iss >> std::ws, reasonkick, ' ');
...
}