带有两个字符串参数的sscanf()

问题描述 投票:-3回答:1

我想在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)

但是当我在游戏中使用命令时,什么也没有发生。语法错误吗?

c++ scanf
1个回答
3
投票

sscanf()不支持正则表达式。您使用%[]占位符的方式确实是错误的语法。请尝试以下方法:

sscanf(command, "/kick %N[^ ] %Ms", playername, reasonkick)

其中NM分别是playernamereasonkick缓冲区的最大宽度。 %N[^ ]将扫描输入字符串,直到遇到空格字符或已扫描N字符为止。无需指定可能遇到的所有单个字符。 %Ms将扫描输入字符串的其余部分,直到到达字符串的结尾或直到已扫描M字符为止。如果需要,可以将%M[^ ]用作该参数。

但是,在C ++中,最好使用std::istringstreamstd::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, ' ');
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.