创建临时字符*并打印到它的正确方法是什么

What is the proper way to create a temporary char* and print to it?

本文关键字:是什么 方法 打印 字符 创建      更新时间:2023-10-16

我有一个辅助函数,它接受固定长度的无符号字符数组,并将其作为格式化的字符*返回。但是,我遇到了一些问题。

我试过了

char* byteArrayToString(unsigned char byte[6]) {
    char t[18] = {""};
    char* str = t;
    sprintf(str, "%02X:%02X:%02X:%02X:%02X:%02X", byte[0], byte[1], byte[2], byte[3], byte[4], byte[5]);
    return str;
}

char* byteArrayToString(unsigned char byte[6]) {
    std::string t = "";
    char* str = t;
    sprintf(str, "%02X:%02X:%02X:%02X:%02X:%02X", byte[0], byte[1], byte[2], byte[3], byte[4], byte[5]);
    return str;
}

char* byteArrayToString(unsigned char byte[6]) {
    char* str = new char();
    sprintf(str, "%02X:%02X:%02X:%02X:%02X:%02X", byte[0], byte[1], byte[2], byte[3], byte[4], byte[5]);
    return str;
}

第二个会导致更改该字符串值的一些副作用。 第一个最终给了我垃圾值和最后一个 seg 错误(但我无法弄清楚为什么)。

你的第一个问题不在于打印,而在于返回。 你返回一个指向已被回收的数组的指针(因为它是一个自动变量,所以它的生存期在函数返回时结束)。

相反,请尝试:

string byteArrayToString(const unsigned char* const byte)
{
    char t[18] = {""};
    sprintf(t, "%02X:%02X:%02X:%02X:%02X:%02X", byte[0], byte[1], byte[2], byte[3], byte[4], byte[5]);
    return t;
}

正确的方法是将std::string返回为:

#include <sstream>   //for std::ostringstream
#include <string>    //for std::string
#include <iomanip>   //for std::setw, std::setfill
std::string byteArrayToString(unsigned char byte[6]) 
{
    std::ostringstream ss;
    for(size_t i = 0 ; i < 5 ; ++i)
         ss << "0X" << std::hex << std::setw(2) << std::setfill('0') << (int) byte[i] << ":";
    ss << "0X" << std::hex << std::setw(2) << std::setfill('0') << (int) byte[5];
    return ss.str();
}

在线演示

在呼叫站点上,您可以获得const char*为:

std::string s = byteArrayToString(bytes);
const char *str = s.c_str();