我正在尝试将一些字符转换为数字类型,但其中一些可能不是以空字符结尾的字符串。对于那些非空终止的字符串,strtol,strtoll,strtod是否安全?
答案 0 :(得分:6)
没有
如果字符数组未被空字符终止,那么它不是字符串。如果任何strto*()
函数传递的参数不指向字符串,则行为未定义。
参考2011 ISO C标准的latest draft:
7.1.1术语定义:
string 是由and结尾的连续字符序列 包括第一个空字符。
7.1.4库函数的使用:
如果函数的参数具有无效值(例如值) 在函数域之外,或者在地址之外的指针 程序的空间,或空指针,或指向 不相应的参数时不可修改的存储 const-qualified)或类型(促销后)不期望的 函数具有可变数量的参数,行为未定义。
7.22.1.3
strtod
,strtof
和strtold
函数:
strtod
,strtof
和strtold
函数会转换 nptr 字符串的初始部分>分别为double
,float
和long double
代表。
(强调补充)
因此,不指向字符串的参数位于函数域之外。
如果数组包含{ '1', '2', '3', 'x', 'y', 'z' }
之类的内容,你很可能会逃脱它,因为它不需要扫描超过期望值的x
,但行为是明确的未定义。
如果你想使用这些函数,你应该在必要时将你的数组复制到另一个缓冲区并自己显式地将其终止。
答案 1 :(得分:1)
只要您的输入以某种方式终止,绝对不是有效的数字字符,处理将停止,并且在找到第一个NUL之前不应该高兴地读取内存。
所以我觉得你没事。