C++等效于 C 的格式字符串
The C++ equivalent of C's format string
我有一个从键盘读取的 C 程序,如下所示:
scanf("%*[ tn]"%[^A-Za-z]%[^"]"", ps1, ps2);
为了更好地理解此指令的作用,让我们按如下方式拆分格式字符串:
%*[ tn]"
=> 读取所有空格、制表符和换行符 ([ tn]
),但不将它们存储在任何变量中(因此是 '*
'),并且将继续读取直到遇到双引号 ("
),但是双引号没有输入。
一旦scanf()
找到双引号,就会将所有不是字母的字符读取到 ps1 中。这是通过...
%[^A-Za-z]
=>输入任何不是大写字母"A"到"Z"和小写字母"a"到"z"的内容。
%[^"]"
=> 读取所有剩余字符,但不包括双引号到 ps2 ([^"]
),并且字符串必须以双引号 ("
结尾),但不输入双引号。
有人可以告诉我如何在C++中做同样的事情吗
谢谢
C++支持scanf
函数。没有简单的替代方案,特别是如果您想复制具有所有怪癖的scanf()
的确切语义。
但请注意,您的代码有几个问题:
-
您没有将要读入的最大字符数传递到
ps1
和ps2
中。任何足够的输入序列都会导致缓冲区溢出,后果不堪设想。 -
您可以在格式字符串中仅使用空格来简化第一个格式
%*[ tn]
。 这也将允许不存在空格字符的情况。如当前所述,如果在"
之前不存在白空格字符,scanf()
将失败并返回0
。 -
类似地,如果在第二个
"
之前没有非字母或后面没有其他字符,scanf
将返回0
或1
的短计数,并使一个或两个目标数组处于不确定状态。
由于所有这些原因,在 C 中,首先读取一行带有fgets()
的输入并使用sscanf()
或手动解析该行会更安全和可预测。
在C++中,您肯定希望使用<regex.h>
中定义的std::regex
包。
相关文章:
- 是否可以从格式字符串中检索"width"
- 我应该如何从 stdin C++ 中读取可变长度的格式字符串?
- 从用户定义的类生成格式字符串?
- 如何连接格式字符串?
- 如何在C++中将"%Y%m%d"格式字符串转换为time_t变量?
- CPPCHECK C++成员函数上的格式字符串
- scanf() 语句中"%*[^n]"的格式字符串指示什么?分配抑制器 (*) 和否定扫描集 ([^) 如何协同工作?
- 自定义 {fmt} 格式化函数,具有编译时格式字符串检查功能
- '|' scanf 格式字符串是什么意思
- 如何使用 msgfmt 验证格式字符串中的位置表示法占位符
- sscanf_s:格式字符串"%d"需要类型为"int *"的参数,但可变参数 4 的类型为"WORD *"
- C4477: 'fprintf' :格式字符串 '%s' 需要类型为"char *"的参数,但可变参数 1 的类型为"int *"
- 如何使用OpenSSL API从其PEM格式字符串中读取RSA公钥
- C 格式字符串宏
- C++等效于 C 的格式字符串
- 如何使用 C++ 中的 rapidjson 库从 json 格式字符串中获取值
- _vsnprintf和_vsnprintf_s的格式字符串中的可用百分比字符
- 如何将格式字符串发送到iostream
- 跨平台格式字符串
- 使用 swprintf() 打印"0x0"的格式字符串应该是什么?