c++ - sscanf() 带有两个字符串参数
问题描述
我想/kick playername reason
用 C++ 创建命令,所以我试了一下:
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()
不支持正则表达式。您使用%[]
占位符的方式确实是错误的语法。试试这个:
if (IPlayer.IsOnline() &&
(IPlayer.GetAdmin() >= 3) &&
(sscanf(command, "/kick %N[^ ] %Ms", playername, reasonkick) == 2))
{
...
}
其中N
和分别是缓冲区M
的最大宽度playername
,例如:reasonkick
char playername[51] = {};
char reasonkick[129] = {};
if (IPlayer.IsOnline() &&
(IPlayer.GetAdmin() >= 3) &&
(sscanf(command, "/kick %50[^ ] %128s", playername, reasonkick) == 2))
{
...
}
将%N[^ ]
扫描输入字符串,直到遇到空格字符或N
已扫描字符。无需指定可能遇到的所有单个字符。将%Ms
扫描输入字符串的其余部分,直到到达字符串末尾或M
扫描完字符。如果需要,您可以%M[^ ]
改为使用该参数。
std::istringstream
但是,在 C++ 中,使用andstd::getline()
代替会更好地处理sscanf()
,例如:
if (IPlayer.IsOnline() && (IPlayer.GetAdmin() >= 3))
{
std::istringstream iss(command);
std::string cmd;
if (std::getline(iss, cmd, ' ') && (cmd == "/kick"))
{
std::string playername, reasonkick;
if (std::getline(iss >> std::ws, playername, ' ') &&
std::getline(iss >> std::ws, reasonkick, ' '))
{
...
}
}
}
推荐阅读
- python - 如何在 IronPython 上找到数组项的交集?
- xslt - 中间没有任何空格的长句子流入相邻的单元格/块:
- json - 如何在 AWS Cloudformation 资源部分的 Fn:Join 中使用用户输入的参数作为参考
- python - 是否可以在字典理解内分配变量?
- amazon-web-services - 将 t3a.medium 转换为 t4g.medium EC2 实例
- node.js - 反应站点网络 main.chunk 长负载
- scala - elastic4s中如何使用search_after
- spring - 使用 skipPolicy 或 ItemListenerSupport 哪一个?
- sh - .bat to .sh translation
- javascript - 使用 lightGallery 创建图像和 HTML5 视频的单个幻灯片