如何在 C++ 中把整型 Int 轉換為 Char 陣列

Jinku Hu 2023年1月30日 2020年9月26日
  1. 使用 std::printf 函式將 int 轉換為 char*
  2. 結合 to_string()c_str() 方法將 int 轉換為 char*
  3. 使用 std::stringstream 類方法進行轉換
  4. 使用 std::to_chars 函式將 int 轉換為 char*
如何在 C++ 中把整型 Int 轉換為 Char 陣列

本文將解釋如何使用不同的方法將整型 int 轉換為 char* 陣列(char*)。

在下面的例子中,我們假設將轉換後的輸出儲存在記憶體緩衝區中,為了驗證的目的,我們將使用 std::printf 輸出結果。

使用 std::printf 函式將 int 轉換為 char*

首先,我們需要分配空間來儲存一個單一的 int 變數,我們要將其轉換到 char 緩衝區中。注意,下面的例子是為整數資料定義最大長度 MAX_DIGITS。為了計算 char 緩衝區的長度,我們新增了 sizeof(char),因為 sprintf 函式會在目的地自動寫入以 \0 結束的 char 字串。因此我們應該注意為這個緩衝區分配足夠的空間。

#include <iostream>

#define MAX_DIGITS 10

int main() {
    int number = 1234;
    char num_char[MAX_DIGITS + sizeof(char)];

    std::sprintf(num_char, "%d", number);
    std::printf("num_char: %s \n", num_char);

    return 0;
}

輸出:

num_char: 1234

請注意,不建議在源緩衝區和目標緩衝區重疊的情況下呼叫 sprintf(例如 sprintf(buf, "%s some text to add", buf)),因為它有未定義的行為,並且根據編譯器會產生不正確的結果。

結合 to_string()c_str() 方法將 int 轉換為 char*

這個版本利用 std::string 類方法來進行轉換,使其比上一個例子中處理 sprintf 要安全得多。

#include <iostream>

int main() {
    int number = 1234;

    std::string tmp = std::to_string(number);
    char const *num_char = tmp.c_str();

    printf("num_char: %s \n", num_char);

    return 0;
}

使用 std::stringstream 類方法進行轉換

這個方法是用 std::stringstream 類實現的。也就是說,我們建立一個臨時的基於字串的流,在這裡儲存 int 資料,然後通過 str 方法返回字串物件,最後呼叫 c_str 進行轉換。

#include <iostream>
#include <sstream>

int main() {
    int number = 1234;

    std::stringstream tmp;
    tmp << number;

    char const *num_char = tmp.str().c_str();
    printf("num_char: %s \n", num_char);;

    return 0;
}

使用 std::to_chars 函式將 int 轉換為 char*

這個版本是在 C++17 中新增的一個純 C++ 風格的函式,定義在標題 <charconv> 中。另外,這個方法提供了對範圍的操作,這可能是特定場景下最靈活的解決方案。

#include <iostream>
#include <charconv>

#define MAX_DIGITS 10

int main() {
    int number = 1234;
    char num_char[MAX_DIGITS + sizeof(char)];

    std::to_chars(num_char, num_char + MAX_DIGITS, number);
    std::printf("num_char: %s \n", num_char);

    return 0;
}
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Integer

相關文章 - C++ Char