C ++格式字符串的C ++等价物

时间:2016-11-22 14:04:50

标签: c++ c scanf cin iomanip

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

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

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

%*[ \t\n]\" =>读取所有空格,制表符和换行符([ \t\n]),但不将它们存储在任何变量中(因此为“*”),并且会一直读取,直到遇到双引号(\"),但是没有输入双引号。

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

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

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

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

谢谢

1 个答案:

答案 0 :(得分:3)

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

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

  • 您没有将要读取的最大字符数传递到ps1ps2。任何足够的输入序列都会导致缓冲区溢出,带来可怕的后果。

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

  • 同样,如果在第二个"之前没有非字母或没有其他字符,则scanf将返回01的简短计数,将一个或两个目标数组保留在不确定状态。

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

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