使用 sscanf 解析输入的 C++ 替代方案

2023-12-24

假设我的程序需要以下形式的参数[ 0.562 , 1.4e-2 ](即浮点对),我应该如何在没有正则表达式的情况下在 C++ 中解析此输入?我知道在用户输入方面需要考虑许多极端情况,但我们假设给定的输入与上述格式紧密匹配(除了进一步的空格)。

在C中,我可以做类似的事情sscanf(string, "[%g , %g]", &f1, &f2);提取两个浮点值,非常紧凑。

在 C++ 中,这是我到目前为止所想出的:

std::string s = "[ 0.562 , 1.4e-2 ]"; // example input

float f1 = 0.0f, f2 = 0.0f;

size_t leftBound = s.find('[', 0) + 1;
size_t count = s.find(']', leftBound) - leftBound;

std::istringstream ss(s.substr(leftBound, count));
string garbage;

ss >> f1 >> garbage >> f2;

if(!ss)
  std::cout << "Error while parsing" << std::endl;

我该如何改进这段代码?我特别关心的是garbage字符串,但我不知道如何跳过,两个值之间。


显而易见的方法是创建一个简单的操纵器并使用它。例如,使用静态提供的操纵器char确定下一个非空白字符是否是该字符,如果是,则提取它可能如下所示:

#include <iostream>
#include <sstream>

template <char C>
std::istream& expect(std::istream& in)
{
    if ((in >> std::ws).peek() == C) {
        in.ignore();
    }
    else {
        in.setstate(std::ios_base::failbit);
    }
    return in;
}

然后,您可以使用由此构建的操纵器来提取字符:

int main(int ac, char *av[])
{
    std::string s(ac == 1? "[ 0.562 , 1.4e-2 ]": av[1]);
    float f1 = 0.0f, f2 = 0.0f;

    std::istringstream in(s);
    if (in >> expect<'['> >> f1 >> expect<','> >> f2 >> expect<']'>) {
        std::cout << "read f1=" << f1 << " f2=" << f2 << '\n';
    }
    else {
        std::cout << "ERROR: failed to read '" << s << "'\n";
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 sscanf 解析输入的 C++ 替代方案 的相关文章

随机推荐

  • Android 跳过 WebView 焦点并使用 TalkBack 直接进入内容

    我的 Android 应用程序中有一个 WebView 但启用 TalkBack 后 它会聚焦于整个视图 用户必须滑动到下一个项目才能开始听到 WebView 内容 有没有办法跳过WebView的选择并直接跳到选择内容 在尝试之后我不这么认
  • 基于控制器操作的 Rails 条件(“if”)语句

    可能有更好的方法来做到这一点 但我试图在控制器中基于当前操作在 Rails 中创建一个 if 语句 这将在视图中使用 例如 如果它是编辑页面或显示页面等 我想要不同的样式 是否有 if 语句可以指定这一点 我需要一个 if 语句 因为它在多
  • Liquibase + Postgresql + Spring Jpa:Id 自动递增问题

    我在实体中有以下描述 Id GeneratedValue strategy GenerationType IDENTITY private Long id 用于生成此 id 的 Liquibase 指令如下
  • 通过 Flask 将串行数据传递给 javascript

    我一直在研究将数据从 Flask 推送到 Javascript 主要是通过修改此处找到的代码 https github com clebio flask d3 https github com clebio flask d3 现在我尝试从
  • Android 中的 ViewPager 滚动问题

    我有一个ViewPager动态数量images在里面 这ViewPager作为自定义行添加到表视图中 由于此表视图可以有多个动态自定义行 因此我必须在scrollview用于滚动 现在我的问题是 当我水平滚动到 查看寻呼机 时 它并不完全是
  • 根据商品数量有条件地按购物车商品添加折扣

    我已经建立了一个 Woocommerce 商店 并希望为所有产品设置基于 12 倍数 一盒 的特定折扣 我尝试了很多折扣插件 但没有找到我想要的 例如 如果我订购 12 件产品 X 我将获得 10 的折扣 如果我订购 15 件产品 X 前
  • 无法在 Mac OS 中使用 Python select.poll?

    python Python 2 7 5 default Aug 25 2013 00 04 04 GCC 4 2 1 Compatible Apple LLVM 5 0 clang 500 0 68 on darwin Type help
  • JavaScript 中的递归函数调用

    我知道在 JavaScript 中对函数进行递归调用时应该小心谨慎 因为第二次调用可能会慢 10 倍 雄辩的 JavaScript http eloquentjavascript net chapter3 html states 有一个重要
  • React 组件中的 render() 函数的作用是什么? [复制]

    这个问题在这里已经有答案了 我是 ReactJS 的新手 对组件类中渲染函数的使用以及 ReactDOM 全局对象的使用感到困惑 对此的回答question https stackoverflow com questions 3346567
  • fgetcsv 无法读取 mac 格式的 csv 文件中的行结尾,有更好的解决方案吗?

    我正在使用 php 和 fgetcsv 函数解析 csv 文件 它解析了一行中的所有内容 后来我发现 csv包含回车符 r 我看到 之前被报告为 php bug 我通过设置 php 运行时配置解决了这个问题 ini set auto det
  • Rcpp/RcppArmadillo:根据位置从向量中删除非连续元素

    假设我有一个向量 2 4 6 8 10 我需要删除第二个and该向量的第四个元素 所需的结果向量应为 2 6 10 这在 R 中很容易实现 v1 lt c 2 4 6 8 10 v1 c 2 4 但是我如何在 Rcpp RcppArmadi
  • LLBLGen:如何软删除条目

    我继承了一个使用 LLBLGen Pro 作为 DB 层的项目 DB 模型要求在删除条目时有一个标志 DeletedDate 设置为当前时间 最后一位程序员忽略了这一要求 并在整个应用程序中使用了常规删除 有没有办法将代码生成器设置为自动执
  • JavaScript - 保持尾随零[重复]

    这个问题在这里已经有答案了 我想解析一个字符串 我使用了parseFloat 但它会删除所有尾随零 如何防止这种情况 我需要准确地解析字符串 如果我有 2 5000 我需要与浮点数完全相同的结果 2 5000 你可以做 parseFloat
  • 以编程方式将扫描图像分割为单独的图像

    为了提高 OCR 质量 我需要对扫描图像进行预处理 有时我需要对带有少量图片的图像进行OCR 页面上的组件并且它们处于不同的角度 例如 一次扫描一些纸质文档 例如 是否有可能以编程方式自动将此类图像划分为包含每个逻辑文档的单独图像 例如使用
  • 将 datashader 图像添加到 matplotlib 子图

    是否可以将 datashader 图像添加到一组 matplotlib 子图中 作为一个具体的例子 import numpy as np import pandas as pd import matplotlib pylab as plt
  • Newtonsoft.Json 导致序列化发生两次,导致 Reference.cs 中出现重复定义

    我有一个具有服务参考的 Common 项目 添加引用后Newtonsoft json 版本6 0 2 http www newtonsoft com json到具有服务引用和可序列化类 ChatLine 的同一项目 公共 Serializa
  • 如何从二维数组中获取数据并放入一维数组中

    我有一个 2D 数组 我想通过 MATLAB 创建 1D 数组 以满足 1D 输出的每个元素都是由 2D 数组中给定索引的值创建的要求 二维数组示例是 A 2 4 6 1 9 7 3 4 5 和一维数组的索引 X 1 2 3 Y 1 2 3
  • 在 PintOS 中运行 make 时获取对“floor”的未定义引用

    我正在尝试在 PintOS makefile 上运行 make 但我不断收到对 floor 错误的未定义引用 生成文件如下 我正在运行带有 gcc 4 6 1 的 Ubuntu 11 10 任何帮助表示赞赏 all setitimer he
  • 使用 jest 运行测试时的可选链接问题

    我正在尝试使用 Jest 运行测试 目前我在 React 应用程序中使用 jsx 和 tsx 从 js 更改为 ts 但是当我运行测试时 除了 tsx 中具有可选阻塞的测试之外 所有 jsx 测试都成功 我总是收到错误Unexpected
  • 使用 sscanf 解析输入的 C++ 替代方案

    假设我的程序需要以下形式的参数 0 562 1 4e 2 即浮点对 我应该如何在没有正则表达式的情况下在 C 中解析此输入 我知道在用户输入方面需要考虑许多极端情况 但我们假设给定的输入与上述格式紧密匹配 除了进一步的空格 在C中 我可以做