字符串转换和格式化¶
用于数字转换和格式化字符串输出的函数。
-
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 值,该值必须在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 并且会被忽略。'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()
几乎相同,只是它忽略大小写。