我正在尝试将一些字符转换为数字类型,但其中一些可能不是以空字符结尾的字符串。那么对于这些没有以空字符结尾的字符串,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
,但行为明确未定义。
如果要使用这些函数,应将数组复制到另一个缓冲区中并显式地自己终止空字符。