是strtol,strtoll,strtod对任何字符安全,甚至不是null终止?

Mic*_*ine 6 c linux string

我试图将一些字符转换为数字类型,但其中一些可能不是以空字符结尾的字符串.对于那些非空终止的字符串,strtol,strtoll,strtod是否安全?

Kei*_*son 6

没有.

如果字符数组未被空字符终止,则它不是字符串.如果任何strto*()函数传递的参数不指向字符串,则行为未定义.

参考2011 ISO C标准的最新草案:

7.1.1术语的定义:

是由封端的字符的连续序列,并且包括第一个空字符.

7.1.4库函数的使用:

如果函数的参数具有无效值(例如函数域外的值,或程序地址空间外的指针,或空指针,或指向不可修改存储的指针,则相应参数不具有const限定条件)或具有可变数量参数的函数不期望的类型(提升后),行为未定义.

7.22.1.3的strtod,strtofstrtold功能:

strtod,strtofstrtold功能的转换的的初始部分指向NPTRdouble,floatlong double分别表示.

(重点补充)

因此,不指向字符串的参数超出了函数的域.

如果数组包含类似的东西{ '1', '2', '3', 'x', 'y', 'z' },你可能会侥幸逃脱它,因为它不需要扫描过去x终止所需的值,但行为显然是未定义的.

如果要使用这些函数,则应根据需要将数组复制到另一个缓冲区中,并自行显式地将其终止.