C++等效于 C 的格式字符串

The C++ equivalent of C's format string

本文关键字:格式 字符串 C++      更新时间:2023-10-16

我有一个从键盘读取的 C 程序,如下所示:

scanf("%*[ tn]"%[^A-Za-z]%[^"]"", ps1, ps2);

为了更好地理解此指令的作用,让我们按如下方式拆分格式字符串:

%*[ tn]"=> 读取所有空格、制表符和换行符 ([ tn]),但不将它们存储在任何变量中(因此是 '*'),并且将继续读取直到遇到双引号 ("),但是双引号没有输入。

一旦scanf()找到双引号,就会将所有不是字母的字符读取到 ps1 中。这是通过...

%[^A-Za-z]=>输入任何不是大写字母"A"到"Z"和小写字母"a"到"z"的内容。

%[^"]"=> 读取所有剩余字符,但不包括双引号到 ps2 ([^"]),并且字符串必须以双引号 ("结尾),但不输入双引号。

有人可以告诉我如何在C++中做同样的事情吗

谢谢

C++支持scanf函数。没有简单的替代方案,特别是如果您想复制具有所有怪癖的scanf()的确切语义。

但请注意,您的代码有几个问题:

  • 您没有将要读入的最大字符数传递到ps1ps2中。任何足够的输入序列都会导致缓冲区溢出,后果不堪设想。

  • 您可以在格式字符串中仅使用空格来简化第一个格式%*[ tn]。 这也将允许不存在空格字符的情况。如当前所述,如果在"之前不存在白空格字符,scanf()将失败并返回0

  • 类似地,如果在第二个"之前没有非字母或后面没有其他字符,scanf将返回01的短计数,并使一个或两个目标数组处于不确定状态。

由于所有这些原因,在 C 中,首先读取一行带有fgets()的输入并使用sscanf()或手动解析该行会更安全和可预测。

在C++中,您肯定希望使用<regex.h>中定义的std::regex包。