我试图将一些字符转换为数字类型,但其中一些可能不是以空字符结尾的字符串.对于那些非空终止的字符串,strtol,strtoll,strtod是否安全?
没有.
如果字符数组未被空字符终止,则它不是字符串.如果任何strto*()函数传递的参数不指向字符串,则行为未定义.
参考2011 ISO C标准的最新草案:
7.1.1术语的定义:
甲串是由封端的字符的连续序列,并且包括第一个空字符.
7.1.4库函数的使用:
如果函数的参数具有无效值(例如函数域外的值,或程序地址空间外的指针,或空指针,或指向不可修改存储的指针,则相应参数不具有const限定条件)或具有可变数量参数的函数不期望的类型(提升后),行为未定义.
7.22.1.3的
strtod,strtof和strtold功能:的
strtod,strtof和strtold功能的转换的的初始部分串指向NPTR到double,float和long double分别表示.
(重点补充)
因此,不指向字符串的参数超出了函数的域.
如果数组包含类似的东西{ '1', '2', '3', 'x', 'y', 'z' },你可能会侥幸逃脱它,因为它不需要扫描过去x终止所需的值,但行为显然是未定义的.
如果要使用这些函数,则应根据需要将数组复制到另一个缓冲区中,并自行显式地将其终止.