首页 > 解决方案 > 如何从知道类型但不知道格式说明符的字符串中扫描值(没有 iostream)

问题描述

我有一个字符串,我需要从中解析/扫描一个值。代码将知道值是什么类型,但不知道应该使用什么格式说明符。有没有一种方法可以在不构建每种类型的查找表及其相关格式说明符的情况下解析值?

我不能使用 cin,因为这是一个嵌入式应用程序,并且添加 iostream 会导致程序大小超过可用闪存。

编辑:一些代码,为了澄清。

我有一个看起来像这样的宏:

#define ITEMS(ENTRY) \
    ENTRY(nameOne,   uint8_t,  1  ) \
    ENTRY(nameTwo,   int16_t, -1  ) \
    ENTRY(nameThree, char,    '1' ) \

表中的每个条目代表一个数据。附加宏用于为每个项目创建非易失性存储,并生成可用于获取或设置值的函数。使用这些宏,而不是手动编写代码,意味着我可以在一个地方添加和更改条目,而不会出现不同步的风险。(就像在创建存储的函数中更改条目的类型,而不是在获取值的函数中。)

我目前正在尝试做的是创建一个可用于设置这些值的文本界面。用户将指定他们想要设置的值,然后输入所需的值,代码将解析该值并调用设置器。

下面是一个简单的示例:

#define SET_ALL_ITEMS(name, type, defaultValue) \
{ \
   cout << "Input a value for " << #name << " : "; \
   type value; \
   cin >> value; \
   Setter(name, &value); \
   cout << endl; \
}

我相信这个例子会奏效。如果您指定值 20、300 和 'f',我希望输出如下所示:

Input a value for nameOne : 20
Input a value for nameTwo : 300
Input a value for nameThree : f

但是,我不能使用cin,因为iostream对于这个特定的嵌入式目标来说太重了,所以我需要坚持使用scanf样式函数。

一种可能的选择是创建一个 Get Value 函数并用我需要的不同类型重载它。我还可以使用 typeid 来创建一个 switch/case 或 if/else if 链,它返回一个带有正确格式说明符的字符串。不过,这两个想法对我来说似乎都很笨拙。我想知道是否有更优雅的解决方案。

标签: c++

解决方案


推荐阅读