以下是glibc实现的strtoul
中函数stdlib.h
的描述:
函数:unsigned long int strtoul(const char*retct string,char**restrict tailptr,int base)
初步:安全的MT现场|安全的| AC安全的|见POSIX安全概念。
strtoul(“string to unsigned long”)函数与strtol类似,只是它转换为unsigned long int值strtol的语法与上面描述的相同。溢出时返回的值是ULONG_MAX(请参阅类型范围)。
如果字符串表示负数,strtoul的作用与strtol相同,但将结果强制转换为无符号整数。例如,这意味着strtoul on“-1”返回ULONG_MAX,而输入大于LONG_MIN返回(ULONG_MAX+1)/2。
strtoul将errno设置为EINVAL,如果base超出范围,或者ERANGE溢出。
这意味着,例如,"-2"
将被转换为ULONG_MAX - 1
。但是C11标准[7.22.1.4-8]说:
strtol、strtoll、strtoul和strtoull函数返回转换后的
价值,如果有的话如果无法执行转换,则返回零。如果正确的值不在可表示值的范围内,则返回LONG廑MIN、LONG廑MAX、LLONG廑MIN、LLONG廑MAX、ULONG廑MAX或ULLONG廑MAX(根据返回类型和值的符号,如果有),宏语言的值存储在errno中。
因此,以标准为例,"-2"
应转换为ULONG_MAX
。是冲突吗?
最佳答案
这可能是glibc
在标准化之前实现特性的另一个例子。
是的,它有冲突。
不过,我认为glibc的结果更有用。如果需要完美的遵从性,可以包装函数以执行转换。
关于c - glibc中的strtoul的实现是否与C11标准冲突?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32895853/