C ++格式字符串的C ++等价物
我有一个从键盘读取的C程序,如下所示:
scanf("%*[ \t\n]\"%[^A-Za-z]%[^\"]\"", ps1, ps2);
为了更好地理解该指令的作用,我们将格式字符串拆分如下:
%*[ \t\n]\"
=>读取所有空格,制表符和换行符( [ \t\n]
),但不将它们存储在任何变量中(因此为’ *
‘),并将继续读取,直到遇到双精度引用( \"
),但双引号不输入。
一旦scanf()
找到双引号,读取所有不是字母的字符到ps1。 这是通过……完成的
%[^A-Za-z]
=>输入任何不是大写字母’A’到’Z’和小写字母’a’到’z’的东西。
%[^\"]\"
=>读取所有剩余的字符,但不包括ps2的双引号( [^\"]
),字符串必须以双引号( \"
)结束,但双引号没有输入。
有人可以告诉我如何在C ++中做同样的事情
谢谢
C ++支持scanf
函数。 没有简单的替代方法,特别是如果你想用所有的怪癖复制scanf()
的确切语义。
但请注意,您的代码有几个问题:
-
您没有传递最大数量的字符来读入
ps1
和ps2
。 任何足够的输入序列都会导致缓冲区溢出,带来可怕的后果 -
您可以使用格式字符串中的空格简化第一个格式
%*[ \t\n]
。 这也允许不存在空白字符的情况。 正如当前所写,如果在"
之前没有空格字符,则scanf()
将失败并返回0
。 -
类似地,如果在第二个
"
之前没有非字母或没有其他字符,则scanf
将返回0
或1
的短计数,并使一个或两个目标数组处于不确定状态。
由于所有这些原因,在C中首先使用fgets()
读取一行输入并使用sscanf()
或手动解析该行将更加安全和可预测。
在C ++中,您肯定希望使用
定义的std::regex
包。