【问题标题】:The C++ equivalent of C's format string [closed]C格式字符串的C++等价物[关闭]
【发布时间】:2017-04-06 06:02:23
【问题描述】:

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

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

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

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

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

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

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

谁能告诉我如何在 C++ 中做同样的事情

谢谢

【问题讨论】:

  • 我说的好像有些人不太清楚! 'cin存在于C++中来代替C的scanf,否则我们不需要'cin'、'cout'以及C++引入的所有特性。
  • @AndrewHenle,所以你的意思是我不能根据一些限制从控制台读取!是你说的吗?对不起,我不相信。
  • @0x5453 我不想在 C++ 中引用 scanf。我想在没有 cstdio 的情况下做同样的事情
  • std::cin 更多地用于直接阅读单词。对于更高级的东西,我们std::regex
  • @appleapple,我在一本书上读到了

标签: c++ c scanf cin iomanip


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-10-14
    • 2023-03-09
    • 2011-03-18
    • 2012-05-17
    • 2017-12-28
    • 2018-08-17
    • 2019-06-23
    • 1970-01-01
    • 2013-07-03
    相关资源
    最近更新 更多