字符串转换和格式化¶
用于数字转换和格式化字符串输出的函数。
-
int PyOS_snprintf(char *str, size_t size, const char *format, ...)¶
- 是 稳定 ABI 的一部分。
根据格式字符串 format 和额外的参数,将不超过 size 字节输出到 str。请参阅 Unix 手册页 snprintf(3)。
-
int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)¶
- 是 稳定 ABI 的一部分。
根据格式字符串 format 和可变参数列表 va,将不超过 size 字节输出到 str。Unix 手册页 vsnprintf(3)。
PyOS_snprintf() 和 PyOS_vsnprintf() 封装了标准 C 库函数 snprintf() 和 vsnprintf()。它们的目的是保证在标准 C 函数无法处理的极端情况下的一致行为。
这些包装器确保 str[size-1] 在返回时始终为 '\0'。它们永远不会向 str 写入超过 size 字节(包括尾部的 '\0')。这两个函数都要求 str != NULL、size > 0、format != NULL 以及 size < INT_MAX。请注意,这意味着没有等效于 C99 的 n = snprintf(NULL, 0, ...),它将确定必要的缓冲区大小。
这些函数的返回值 (rv) 应按如下方式解释
当
0 <= rv < size时,输出转换成功,并且将 rv 个字符写入 str(不包括str[rv]处的尾随'\0'字节)。当
rv >= size时,输出转换被截断,需要一个大小为rv + 1字节的缓冲区才能成功。在这种情况下,str[size-1]为'\0'。当
rv < 0时,“发生了错误”。在这种情况下,str[size-1]也为'\0',但 str 的其余部分未定义。错误的确切原因取决于底层平台。
以下函数提供与区域设置无关的字符串到数字的转换。
-
unsigned long PyOS_strtoul(const char *str, char **ptr, int base)¶
- 是 稳定 ABI 的一部分。
根据给定的
base将str中字符串的初始部分转换为 unsigned long 值,该值必须介于2和36(含)之间,或者为特殊值0。忽略前导空格和字符的大小写。如果
base为零,则查找前导0b、0o或0x来确定基数。如果这些都不存在,则默认为10。基数必须为 0 或介于 2 和 36(含)之间。如果ptr不为NULL,则它将包含指向扫描结束位置的指针。如果转换后的值超出对应返回类型的范围,则会发生范围错误(
errno设置为ERANGE),并返回ULONG_MAX。如果无法执行转换,则返回0。另请参阅 Unix 手册页 strtoul(3)。
在版本 3.2 中添加。
-
long PyOS_strtol(const char *str, char **ptr, int base)¶
- 是 稳定 ABI 的一部分。
根据给定的
base将字符串str的初始部分转换为 long 值,base必须介于2和36之间(包含),或者为特殊值0。与
PyOS_strtoul()相同,但返回 long 值,溢出时返回LONG_MAX。另请参阅 Unix 手册页 strtol(3)。
在版本 3.2 中添加。
-
double PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception)¶
- 是 稳定 ABI 的一部分。
将字符串
s转换为 double,在失败时引发 Python 异常。接受的字符串集对应于 Python 的float()构造函数接受的字符串集,但s必须没有前导或尾随空格。转换独立于当前区域设置。如果
endptr为NULL,则转换整个字符串。如果字符串不是浮点数的有效表示,则引发ValueError并返回-1.0。如果 endptr 不为
NULL,则尽可能地转换字符串,并将*endptr设置为指向第一个未转换的字符。如果字符串的任何初始段都不是浮点数的有效表示,则将*endptr设置为指向字符串的开头,引发 ValueError,并返回-1.0。如果
s表示的值太大而无法存储在浮点数中(例如,在许多平台上,"1e500"就是这样的字符串),那么如果overflow_exception为NULL,则返回Py_HUGE_VAL(带有适当的符号),并且不设置任何异常。否则,overflow_exception必须指向 Python 异常对象;引发该异常并返回-1.0。在这两种情况下,都将*endptr设置为指向已转换值后的第一个字符。如果转换过程中出现任何其他错误(例如内存不足错误),请设置相应的 Python 异常并返回
-1.0。在 3.1 版本中添加。
-
char *PyOS_double_to_string(double val, char format_code, int precision, int flags, int *ptype)¶
- 是 稳定 ABI 的一部分。
使用提供的 format_code、precision 和 flags 将 double val 转换为字符串。
format_code 必须是
'e'、'E'、'f'、'F'、'g'、'G'或'r'之一。对于'r',提供的 precision 必须为 0 且会被忽略。format_code 为'r'指定标准repr()格式。flags 可以是
Py_DTSF_SIGN、Py_DTSF_ADD_DOT_0或Py_DTSF_ALT中的值的任意组合,通过或运算组合在一起。Py_DTSF_SIGN表示始终在返回的字符串前面加上符号字符,即使 val 为非负数。Py_DTSF_ADD_DOT_0表示确保返回的字符串不会看起来像整数。Py_DTSF_ALT表示应用“备用”格式化规则。有关详细信息,请参阅PyOS_snprintf()'#'说明符的文档。
如果 ptype 非
NULL,则它指向的值将被设置为Py_DTST_FINITE、Py_DTST_INFINITE或Py_DTST_NAN之一,分别表示 val 是有限数、无限数或非数。返回值是指向 buffer 的指针,其中包含转换后的字符串,如果转换失败则为
NULL。调用者负责通过调用PyMem_Free()释放返回的字符串。在 3.1 版本中添加。
-
int PyOS_stricmp(const char *s1, const char *s2)¶
不区分大小写的字符串比较。该函数的工作方式与
strcmp()几乎相同,只是它忽略大小写。
-
int PyOS_strnicmp(const char *s1, const char *s2, Py_ssize_t size)¶
不区分大小写的字符串比较。该函数的工作方式几乎与
strncmp()相同,只是它忽略大小写。