字符串转换和格式设置

用于数字转换和格式化字符串输出的函数。

int PyOS_snprintf(char *str, size_t size, const char *format, ...)

输出不超过 size 字节到 str 根据格式字符串 格式 以及其他的参数。参见Unix手册页 snprintf(2) .

int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)

输出不超过 size 字节到 str 根据格式字符串 格式 变量参数列表 va . UNIX手册 vsnprintf(2) .

PyOS_snprintf()PyOS_vsnprintf() 封装标准C库函数 snprintf()vsnprintf() . 它们的目的是保证在角落情况下的行为一致,而标准的C函数则没有。

包装机确保 str [size-1] 总是 '\0' 回来时。他们写的最多 size 字节(包括尾随 '\0' )两个函数都要求 str != NULLsize > 0format != NULLsize < INT_MAX .

返回值( rv )对于这些功能,应解释如下:

  • 什么时候? 0 <= rv < size ,输出转换成功,并且 rv 字符被写入 str (不包括尾随 '\0' 字节在 str [rv] )

  • 什么时候? rv >= size ,输出转换被截断,缓冲区 rv + 1 成功需要字节。 str [size-1] 是 '\0' 在这种情况下。

  • 什么时候? rv < 0 “发生了一些不好的事情。” str [size-1] 是 '\0' 在这种情况下也一样,但是 str 是未定义的。错误的确切原因取决于底层平台。

以下函数提供与区域设置无关的字符串到数字转换。

double PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception)

转换字符串 s 到A double ,失败时引发python异常。接受的字符串集与python接受的字符串集相对应。 float() 构造函数,除了 s 不能有前导空格或尾随空格。转换独立于当前区域设置。

如果 endptrNULL ,转换整个字符串。提高 ValueError 然后返回 -1.0 如果字符串不是浮点数的有效表示形式。

如果endptr不是 NULL ,尽可能多地转换字符串并设置 *endptr 指向第一个未转换的字符。如果字符串的初始段不是浮点数的有效表示形式,则设置 *endptr 指向字符串的开头,引发ValueError,然后返回 -1.0 .

如果 s 表示一个值太大,无法存储在浮点中(例如, "1e500" 在许多平台上是这样的字符串)那么如果 overflow_exceptionNULL 返回 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)

转换为 double val 使用提供的 format_code精度flags .

format_code 一定是其中之一 'e''E''f''F''g''G''r' . 为了 'r' ,提供的 精度 必须为0并被忽略。这个 'r' 格式代码指定标准 repr() 格式。

旗帜 可以是零个或多个值 Py_DTSF_SIGNPy_DTSF_ADD_DOT_0Py_DTSF_ALT 或一起编辑:

  • Py_DTSF_SIGN 表示始终在返回的字符串之前使用符号字符,即使 val 是非负的。

  • Py_DTSF_ADD_DOT_0 表示确保返回的字符串看起来不像整数。

  • Py_DTSF_ALT 表示应用“替代”格式规则。有关 PyOS_snprintf() '#' 详细信息的说明符。

如果 P型 为非-NULL`,则它指向的值将设置为 ``Py_DTST_FINITEPy_DTST_INFINITEPy_DTST_NAN ,表示 val 分别是有限数、无限数或非数字。

返回值是指向 缓冲区 使用转换后的字符串或 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() 只是它忽略了这个情况。