R..*_*R.. 6 c standards-compliance language-lawyer strtol
strtol概念上,规范将输入字符串分为"初始空格","主题序列"和"最终字符串",并将"主题序列"定义为:
输入字符串的最长初始子序列,从第一个具有预期形式的非空白字符开始.如果输入字符串为空或完全由空格字符组成,或者第一个非空白字符不是符号或允许的字母或数字,则主题序列不应包含任何字符.
有一次,我认为"最长的初始子序列"业务类似于scanf工作方式,在哪里"0x@"扫描"0x",失败的匹配,然后"@"作为下一个未读的角色.然而,在经过一些讨论之后,我基本上确信strtol处理了预期形式的最长初始子序列,而不是最长的初始字符串,它是预期形式的某些可能字符串的初始子序列.
令我困惑的是规范中的这种语言:
如果主题序列为空或者没有预期的形式,则不进行转换; str的值存储在endptr指向的对象中,前提是endptr不是空指针.
如果我们接受似乎是"主题序列"的正确定义,那么就没有不具有预期形式的非空主题序列,而是(为了避免冗余和混淆)文本应该只读:
如果主题序列为空,则不执行转换; str的值存储在endptr指向的对象中,前提是endptr不是空指针.
谁能为我澄清这些问题?也许与过去的讨论或任何相关缺陷报告的链接将是有用的.
strtol 的 POSIX 规范似乎更清晰:
这些函数应分别将 str 指向的字符串的初始部分转换为 long 和 long long 表示形式。首先,它们将输入字符串分解为三个部分:
初始的、可能为空的空白字符序列(由 isspace() 指定)
主题序列解释为以某个基数表示的整数,该基数由基数的值确定
由一个或多个无法识别的字符组成的最终字符串,包括输入字符串的终止 NUL 字符。
然后他们将尝试将主题序列转换为整数,并返回结果。
但当然,它不是规范性的,并且“遵循 ISO C 标准”。