使用sscanf解析字符串好吗?
is it good to use sscanf for parsing string
我一直在我的解析器中使用sscanf()来获得一些css像标记,如颜色代码下面的一些变化;
#FDC69A
#ff0
orange
示例代码为;
int r g b;
cosnt char* s = "#FAFAFA";
if(sscanf(s, "#%02x%02x%02x", &r, &g, &b) == 3){
// color code ok
}
我当前项目的首选语言是c++,我认为sscanf可以比普通字符逐字符解析更快,整体代码将没有bug &尽管如此,它可能有跨不同编译器的可移植性问题。
我注意到的一件事是,流行的开源项目不使用sscanf对输入缓冲区进行标记,而是逐个字符地进行标记,使用sscanf进行解析是一种糟糕的编程实践,我遵循?
sscanf
(以及scanf
和fscanf
)的最大问题是数字溢出导致未定义行为。例如:
const char *s = "999999999999999999999999999999";
int n;
sscanf(s, "%d", &n);
C标准没有明确说明这段代码的行为。它可能会将n
设置为某个任意值,它可能会报告错误,或者它可能会崩溃。
(在实践中,现有的实现可能表现得很合理,对于某些"合理"的值。)
if(sscanf(s, "#%02x%02x%02x", &r, &g, &b) == 3)
是健壮的…没什么好担心的。
%d
没有给出int*
)…许多现代编译器都有足够的验证来避免这样的事故。
尽管如此,c++仍然有iostreams,人们倾向于在许多I/O和解析操作中使用它们,因为流析构函数会自动刷新和关闭文件以及释放描述符,它们是类型安全的,可扩展到用户定义的类型,您通常可以为任何类型的流重用解析/输出代码,而且它们通常很方便。不过,对于你上面的特定测试来说,它们要乏味得多。
如果你注意到很多OSS程序一个字符一个字符地扫描,这可能是因为:
他们正在做更复杂的解析-他们想要在读取单个字符后分支到不同的解析逻辑,或者
- 在你的代码中,你有一个坚定的期望,所以做一个
sscanf
来测试是合理的,但是如果你写一个编译器,它会太慢,尝试一个巨大的if
/else
列表,数百sscanf
尝试识别令牌。
- 在你的代码中,你有一个坚定的期望,所以做一个
,
- 与
scanf
,fscanf
相关,但不sscanf
-避免扫描太远,以便它们可以ungetc,这(从内存中)只能移植保证为1个字符工作。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- sscanf() 有两个字符串参数
- 从中加载字符串时出现 sscanf 问题
- 如何将SSCANF()设置为在字符串开始时忽略字符
- 如何使用正则表达式中的 sscanf() 解析字符串
- SSCANF在将字符串分解为双值时未能通过
- C++ SSCANF 读取字符串向量
- C++ sscanf 空格分隔字符串
- 用户定义的字符串文字和模式与sscanf匹配
- 如何使用sscanf扫描由“/”分隔的两个字符串
- 为什么 sscanf 跳过每个字符串中的前 4 个字符
- 使用 sscanf 从字符串中读取多个值
- 正确使用sscanf解析字符串c++
- 在C++中使用sscanf从字符串中提取int
- Sscanf用于此类型的字符串
- 使用sscanf读取字符串
- 使用sscanf解析字符串好吗?
- 如何将字符串中的多个浮点数转换为多个浮点数?(sscanf)
- sscanf C++ 将字符串拆分为整数有时不起作用