gpt4 book ai didi

c++ - C++ 相当于 C 格式字符串

转载 作者:行者123 更新时间:2023-11-30 21:47:44 26 4
gpt4 key购买 nike

我有一个从键盘读取的 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 <regex.h> 中定义的包.

关于c++ - C++ 相当于 C 格式字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40743948/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com