使用sscanf解析字符串是否合适?

duc*_*kgo 1 c++

我一直在我的解析器中使用sscanf()获取一些css,比如令牌,如颜色代码,下面有一些变化;

#FDC69A
#ff0
orange
Run Code Online (Sandbox Code Playgroud)

示例代码将是;

int r g b;
cosnt char* s = "#FAFAFA";
if(sscanf(s, "#%02x%02x%02x", &r, &g, &b) == 3){
// color code ok
}
Run Code Online (Sandbox Code Playgroud)

我当前项目的首选语言是c ++,我认为sscanf可以比常规字符更快地进行字符解析,并且整体代码将是无bug且最小的,但它可能在不同的编译器中存在可移植性问题.

我就是看到一个东西,流行的开源项目中不使用的sscanf的令牌化输入缓冲器,而不是他们这样做是通过炭炭,这是一个不好的编程习惯在解析使用的sscanf是我关注的?

Kei*_*son 6

sscanf(以及scanffscanf)的最大问题是数字溢出会导致未定义的行为.例如:

const char *s = "999999999999999999999999999999";
int n;
sscanf(s, "%d", &n);
Run Code Online (Sandbox Code Playgroud)

C标准对这段代码的行为一无所知.它可能设置n为某个任意值,可能会报告错误,或者可能会崩溃.

(在实践中,对于某些"明智"的价值,现有的实施可能表现得很明智.)