“Python/docs/3.9/c-api/conversion”的版本间差异
(autoload) |
小 (Page commit) |
||
第1行: | 第1行: | ||
+ | {{DISPLAYTITLE:字符串转换和格式化 — Python 文档}} | ||
<div id="string-conversion-and-formatting" class="section"> | <div id="string-conversion-and-formatting" class="section"> | ||
<span id="string-conversion"></span> | <span id="string-conversion"></span> | ||
− | = | + | = 字符串转换和格式化 = |
− | + | 用于数字转换和格式化字符串输出的函数。 | |
− | ; int < | + | ; <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyOS_snprintf</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">str</span></span>, <span class="n"><span class="pre">size_t</span></span><span class="w"> </span><span class="n"><span class="pre">size</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">format</span></span>, <span class="p"><span class="pre">...</span></span><span class="sig-paren">)</span><br /> |
− | |||
− | + | : 根据格式字符串 ''format'' 和额外的参数,输出不超过 ''size'' 个字节到 ''str''。 请参阅 Unix 手册页 ''snprintf(3)''。 | |
− | |||
− | + | ; <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyOS_vsnprintf</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">str</span></span>, <span class="n"><span class="pre">size_t</span></span><span class="w"> </span><span class="n"><span class="pre">size</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">format</span></span>, <span class="n"><span class="pre">va_list</span></span><span class="w"> </span><span class="n"><span class="pre">va</span></span><span class="sig-paren">)</span><br /> | |
− | |||
− | |||
− | |||
− | + | : 根据格式字符串''format''和变量参数列表''va''输出不超过''size''个字节到''str''。 Unix 手册页 ''vsnprintf(3)''。 | |
− | |||
− | |||
− | + | [[#c.PyOS_snprintf|PyOS_snprintf()]] 和 [[#c.PyOS_vsnprintf|PyOS_vsnprintf()]] 包装了标准 C 库函数 <code>snprintf()</code> 和 <code>vsnprintf()</code>。 它们的目的是在极端情况下保证一致的行为,而标准 C 函数则没有。 | |
− | |||
− | |||
− | + | 包装器确保 <code>str[size-1]</code> 在返回时始终为 <code>'\0'</code>。 他们从不向 str 写入超过 ''size'' 个字节(包括尾随的 <code>'\0'</code>)。 这两个函数都需要 <code>str != NULL</code>、<code>size > 0</code> 和 <code>format != NULL</code>。 | |
− | + | 如果平台没有 <code>vsnprintf()</code> 并且避免截断所需的缓冲区大小超过 ''size'' 超过 512 个字节,则 Python 会以 [[../sys#c|Py_FatalError()]] 中止。 | |
− | |||
− | |||
− | + | 这些函数的返回值 (''rv'') 应解释如下: | |
+ | |||
+ | * 当<code>0 <= rv < size</code>时,输出转换成功,''rv''字符被写入''str''(不包括<code>str[rv]</code>处的尾随<code>'\0'</code>字节)。 | ||
+ | * 当 <code>rv >= size</code> 时,输出转换被截断,并且需要具有 <code>rv + 1</code> 字节的缓冲区才能成功。 在这种情况下,<code>str[size-1]</code> 是 <code>'\0'</code>。 | ||
+ | * 当<code>rv < 0</code>时,“发生了不好的事情。” <code>str[size-1]</code> 在这种情况下也是 <code>'\0'</code>,但 ''str'' 的其余部分未定义。 错误的确切原因取决于底层平台。 | ||
+ | |||
+ | 以下函数提供与语言环境无关的字符串到数字的转换。 | ||
<dl> | <dl> | ||
− | <dt>double < | + | <dt><span class="kt"><span class="pre">double</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyOS_string_to_double</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">s</span></span>, <span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">endptr</span></span>, [[../structures#c|<span class="n"><span class="pre">PyObject</span></span>]]<span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">overflow_exception</span></span><span class="sig-paren">)</span><br /> |
− | <dd><p> | + | </dt> |
− | + | <dd><p>将字符串 <code>s</code> 转换为 <span class="xref c c-texpr">double</span>,在失败时引发 Python 异常。 接受的字符串集对应于 Python 的 [[../../library/functions#float|float()]] 构造函数接受的字符串集,除了 <code>s</code> 不能有前导或尾随空格。 转换与当前语言环境无关。</p> | |
− | + | <p>如果 <code>endptr</code> 是 <code>NULL</code>,则转换整个字符串。 如果字符串不是浮点数的有效表示,则引发 [[../../library/exceptions#ValueError|ValueError]] 并返回 <code>-1.0</code>。</p> | |
− | + | <p>如果 endptr 不是 <code>NULL</code>,则尽可能多地转换字符串并将 <code>*endptr</code> 设置为指向第一个未转换的字符。 如果没有字符串的初始段是浮点数的有效表示,则将 <code>*endptr</code> 设置为指向字符串的开头,引发 ValueError,并返回 <code>-1.0</code>。</p> | |
− | + | <p>如果 <code>s</code> 表示的值太大而无法存储在浮点数中(例如,<code>"1e500"</code> 在许多平台上都是这样的字符串),那么如果 <code>overflow_exception</code> 是 [ X155X] 返回 <code>Py_HUGE_VAL</code>(带有适当的符号)并且不设置任何异常。 否则,<code>overflow_exception</code> 必须指向一个 Python 异常对象; 引发该异常并返回 <code>-1.0</code>。 在这两种情况下,将 <code>*endptr</code> 设置为指向转换值后的第一个字符。</p> | |
− | <p> | + | <p>如果在转换过程中发生任何其他错误(例如内存不足错误),请设置适当的 Python 异常并返回 <code>-1.0</code>。</p> |
− | [[../../library/exceptions#ValueError| | ||
− | |||
− | <p> | ||
− | |||
− | |||
− | |||
− | |||
− | <code>-1.0</code> | ||
− | <p> | ||
− | |||
− | |||
− | |||
− | <code>overflow_exception</code> | ||
− | |||
− | <code>*endptr</code> | ||
− | <p> | ||
− | |||
− | |||
<div class="versionadded"> | <div class="versionadded"> | ||
− | <p><span class="versionmodified added">3.1 | + | <p><span class="versionmodified added">3.1 版中的新功能。</span></p> |
</div></dd></dl> | </div></dd></dl> | ||
<dl> | <dl> | ||
− | <dt>char *< | + | <dt><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">PyOS_double_to_string</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">double</span></span><span class="w"> </span><span class="n"><span class="pre">val</span></span>, <span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="n"><span class="pre">format_code</span></span>, <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">precision</span></span>, <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">flags</span></span>, <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">ptype</span></span><span class="sig-paren">)</span><br /> |
− | <dd><p> | + | </dt> |
− | + | <dd><p>使用提供的 ''format_code''、''precision'' 和 ''flags'' 将 <span class="xref c c-texpr">double</span> ''val'' 转换为字符串。</p> | |
− | <p>''format_code'' | + | <p>''format_code'' 必须是 <code>'e'</code>、<code>'E'</code>、<code>'f'</code>、<code>'F'</code>、<code>'g'</code>、[ X95X] 或 <code>'r'</code>。 对于 <code>'r'</code>,提供的 ''precision'' 必须为 0 且被忽略。 <code>'r'</code> 格式代码指定标准的 [[../../library/functions#repr|repr()]] 格式。</p> |
− | <code>'g'</code> | + | <p>''flags'' 可以是值 <code>Py_DTSF_SIGN</code>、<code>Py_DTSF_ADD_DOT_0</code> 或 <code>Py_DTSF_ALT</code> 中的零个或多个,或一起计算:</p> |
− | |||
− | |||
− | <p>''flags'' | ||
− | <code>Py_DTSF_ADD_DOT_0</code> | ||
<ul> | <ul> | ||
− | <li><p><code>Py_DTSF_SIGN</code> | + | <li><p><code>Py_DTSF_SIGN</code> 意味着总是在返回的字符串前面加上一个符号字符,即使 ''val'' 是非负的。</p></li> |
− | + | <li><p><code>Py_DTSF_ADD_DOT_0</code> 表示确保返回的字符串不会像整数。</p></li> | |
− | <li><p><code>Py_DTSF_ADD_DOT_0</code> | + | <li><p><code>Py_DTSF_ALT</code> 表示应用“替代”格式规则。 有关详细信息,请参阅 [[#c.PyOS_snprintf|PyOS_snprintf()]] <code>'#'</code> 说明符的文档。</p></li></ul> |
− | |||
− | <li><p><code>Py_DTSF_ALT</code> | ||
− | |||
− | |||
− | <p> | + | <p>如果 ''ptype'' 是非 <code>NULL</code>,那么它指向的值将被设置为 <code>Py_DTST_FINITE</code>、<code>Py_DTST_INFINITE</code> 或 <code>Py_DTST_NAN</code> 之一],分别表示''val''为有限数、无限数或非数。</p> |
− | <code>Py_DTST_FINITE</code> | + | <p>如果转换失败,则返回值是指向 ''buffer'' 的指针以及转换后的字符串或 <code>NULL</code>。 调用者负责通过调用 [[../memory#c|PyMem_Free()]] 来释放返回的字符串。</p> |
− | ''val'' | ||
− | <p> | ||
− | <code>NULL</code> | ||
− | |||
<div class="versionadded"> | <div class="versionadded"> | ||
− | <p><span class="versionmodified added">3.1 | + | <p><span class="versionmodified added">3.1 版中的新功能。</span></p> |
</div></dd></dl> | </div></dd></dl> | ||
− | ; int <code> | + | ; <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyOS_stricmp</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">s1</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">s2</span></span><span class="sig-paren">)</span><br /> |
− | : | + | |
+ | : 字符串不区分大小写的比较。 该函数的工作原理与 <code>strcmp()</code> 几乎相同,只是它忽略了大小写。 | ||
+ | |||
+ | ; <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">PyOS_strnicmp</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">s1</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">s2</span></span>, <span class="n"><span class="pre">Py_ssize_t</span></span><span class="w"> </span><span class="n"><span class="pre">size</span></span><span class="sig-paren">)</span><br /> | ||
+ | |||
+ | : 字符串不区分大小写的比较。 该函数的工作原理与 <code>strncmp()</code> 几乎相同,只是它忽略了大小写。 | ||
+ | |||
+ | |||
+ | </div> | ||
+ | <div class="clearer"> | ||
− | |||
− | |||
</div> | </div> | ||
− | [[Category:Python 3.9 | + | [[Category:Python 3.9 文档]] |
2021年10月31日 (日) 04:50的最新版本
字符串转换和格式化
用于数字转换和格式化字符串输出的函数。
- int PyOS_snprintf(char *str, size_t size, const char *format, ...)
- 根据格式字符串 format 和额外的参数,输出不超过 size 个字节到 str。 请参阅 Unix 手册页 snprintf(3)。
- int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)
- 根据格式字符串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
。
如果平台没有 vsnprintf()
并且避免截断所需的缓冲区大小超过 size 超过 512 个字节,则 Python 会以 Py_FatalError() 中止。
这些函数的返回值 (rv) 应解释如下:
- 当
0 <= rv < size
时,输出转换成功,rv字符被写入str(不包括str[rv]
处的尾随'\0'
字节)。 - 当
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
转换为 double,在失败时引发 Python 异常。 接受的字符串集对应于 Python 的 float() 构造函数接受的字符串集,除了s
不能有前导或尾随空格。 转换与当前语言环境无关。如果
endptr
是NULL
,则转换整个字符串。 如果字符串不是浮点数的有效表示,则引发 ValueError 并返回-1.0
。如果 endptr 不是
NULL
,则尽可能多地转换字符串并将*endptr
设置为指向第一个未转换的字符。 如果没有字符串的初始段是浮点数的有效表示,则将*endptr
设置为指向字符串的开头,引发 ValueError,并返回-1.0
。如果
s
表示的值太大而无法存储在浮点数中(例如,"1e500"
在许多平台上都是这样的字符串),那么如果overflow_exception
是 [ X155X] 返回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)
使用提供的 format_code、precision 和 flags 将 double val 转换为字符串。
format_code 必须是
'e'
、'E'
、'f'
、'F'
、'g'
、[ X95X] 或'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()
几乎相同,只是它忽略了大小写。