sscanf() 有两个字符串参数
sscanf() with two string parameters
我想在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()
不支持正则表达式。您使用%[]
占位符的方式确实是错误的语法。试试这个:
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[^ ]
。
但是,在C++中,最好使用std::istringstream
和std::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, ' '))
{
...
}
}
}
相关文章:
- c++ 构造函数 将 1 个字符串参数转换为 3 个属性
- 对函数的 out 字符串参数使用 swap 与赋值
- sscanf() 有两个字符串参数
- isPalindrome不显示输出,isPalindrome函数未使用字符串输入作为字符串参数进行测试
- 如何通过C++在Python函数中传递字符串参数
- 将字符串参数传递给 ifstream
- Pybind11:将字符串*参数传递给构造函数
- 为什么我不能提供一个字符串参数来打印 ncurses?
- 为什么将char*传递给字符串参数会产生汇编错误
- 字符串参数常量字符* 和常量 wchar_t*
- 无法将字符串参数传递到构造函数中?
- 为什么对字符串参数的常量引用可以采用字符串文字?
- C 中的模板专业化中的字符串参数
- 如何使用单声道嵌入将字符串参数传递给 c# 方法
- 如何检查谷歌模拟中作为空指针传递的字符串参数
- 向 const 字符串参数发送 0 int 文本时的访问冲突
- 构造函数字符串参数未设置窗口标题
- C++ 重构采用 int 或字符串参数的方法
- 调用具有字符串参数direct vs variable的函数
- 如何使用 2 个字符串参数从 jni java 库调用