字串轉換和格式化

用於數字轉換和格式化字串輸出的函式。

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'。它們絕不會寫入超過 size 位元組(包括末尾的 '\0')到 str 中。兩個函式都要求 str != NULL, size > 0, format != NULLsize < 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 值,base 必須在 236(含)之間,或者是一個特殊值 0

忽略前導空格和字元大小寫。如果 base 為零,它會查詢前導的 0b0o0x 來判斷基數。如果這些不存在,則預設為 10。基數必須為 0 或介於 2 到 36(含)之間。如果 ptrNULL,它將包含指向掃描結束位置的指標。

如果轉換後的值超出相應返回型別的範圍,則發生範圍錯誤(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 必須在 236(含)之間,或者是一個特殊值 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 不得有前導或尾隨空格。轉換與當前語言環境無關。

如果 endptrNULL,則轉換整個字串。如果字串不是浮點數的有效表示,則引發 ValueError 並返回 -1.0

如果 endptr 不為 NULL,則儘可能多地轉換字串,並將 *endptr 設定為指向第一個未轉換的字元。如果字串的初始部分不是浮點數的有效表示,則將 *endptr 設定為指向字串的開頭,引發 ValueError,並返回 -1.0

如果 s 表示的值過大,無法儲存在浮點數中(例如,在許多平臺上 "1e500" 就是這樣的字串),那麼如果 overflow_exceptionNULL,則返回 Py_INFINITY(帶有適當的符號),並且不設定任何異常。否則,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_codeprecisionflagsdouble val 轉換為字串。

format_code 必須是 'e''E''f''F''g''G''r' 之一。對於 'r',提供的 precision 必須為 0 且會被忽略。'r' 格式程式碼指定標準的 repr() 格式。

flags 可以是 Py_DTSF_SIGNPy_DTSF_ADD_DOT_0Py_DTSF_ALT 中的零個或多個值的按位或組合。

  • Py_DTSF_SIGN 表示即使 val 為非負數,返回的字串也總是以符號字元開頭。

  • Py_DTSF_ADD_DOT_0 表示確保返回的字串不會看起來像一個整數。

  • Py_DTSF_ALT 表示應用“備用”格式化規則。有關詳細資訊,請參閱 PyOS_snprintf()'#' 說明符的文件。

如果 ptypeNULL,則它指向的值將被設定為 Py_DTST_FINITEPy_DTST_INFINITEPy_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() 相同,只是它忽略了大小寫。