天道酬勤,学无止境

C++ 转换向量到第一个向量字节为 0 的字符串(C++ Converting Vector<BYTE> to string where first vector byte is 0)

问题

我正在尝试将 BYTES(或无符号字符)的 std::vector 转换为 std::string。 我遇到的问题是当向量的第一个元素为 0 时,转换后返回一个空字符串。

我已经尝试了以下两种方法。 string1 和 string2 都返回一个空字符串。 我期望的结果是一个以 2 x 0 开头的字符串,后跟其他几个字符。

// vector of BYTE, contains these 7 elements for example: (0,30,85,160,155,93,0)
std::vector<BYTE> data;

// method 1
BYTE* pByteArray = &data[0];
std::string string1 = reinterpret_cast<LPCSTR>(pByteArray);

// method 2
std::string string2(data.begin(),data.end());

// both string1 and string2 return ""

我猜是因为向量中的第一个 BYTE 是 0,所以字符串赋值认为它是 null 或空的。 为了返回字符串的其余部分,我可以做一些其他的转换吗?

非常感谢任何帮助。

回答1

第二个不是真的空请考虑:

// vector of BYTE, contains these 7 elements for example: (0,30,85,160,155,93,0)
std::vector<BYTE> data = {0, 35, 35 ,38};

// method 2
std::string string2(data.begin(),data.end());
cout<< (string2.data()+1) << " size:"<< string2.size() << endl;
/* Notice that size is 4 */

有一个想法

编辑检查大小更简单,因为它是4


关于datanull终止,文档亲切地解释(强调我的):

返回的数组是空终止的,即 data() 和 c_str() 执行相同的功能。 如果 empty() 返回 true,则指针指向单个空字符。 (C++11 起)

“c++98 安全”方式可能如下所示:

cout.write(string2.data()+1, string2.size()-1); 

无论如何,打印只是为了展示字符串“非空”:)

回答2

第一种方法是错误的,但是第二种方法给出了正确的结果 - 字符串,即空终止。 如果终止标记 (null) 是第一个字符,它看起来是空的,但实际上不是。

另外,关于第一种方法,您想要:

std::vector<BYTE> data;
//some code
std::string string1(reinterpret_cast<const char *>(&data[0]), data.length());
回答3

如果有人正在寻找像0x90 0xBA 0xFF这样的十六进制输出,那么这里是我用来生成它们的代码:

template <typename T>
std::string to_hex(T data)
{
    std::ostringstream result;
    result << std::setw(2) << std::setfill('0') << std::hex << std::uppercase << static_cast<int>(data);
    return result.str();
}

std::string dump(const std::vector<unsigned char>& data)
{
    if (data.empty()) return "";
    auto size = data.size();
    std::ostringstream result;
    for(u32 i =0; i < size; i++)
    {
        result << "0x" + to_hex(data[i]);
        if (i != size)
            result << " ";
    }
    return result.str();
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在 C++ 中序列化向量以通过 UDP 套接字发送?(Serialize vector in C++ to send over UDP Socket?)
    问题 作为学期末项目的一部分,我们需要实施分布式聊天系统。 该系统需要具有可扩展性和健壮性。 牢记这些标准,我对如何通过套接字发送矢量对象感到困惑。 由于向量是动态分配的,因此发送它的对象将不起作用,因为它指向的内存没有被复制。 为了完成这个序列化将是最好的选择。 但是,根据我们的项目要求,我们不应该使用任何第三方库,例如 Boost 和 Google Protocol Buffers。 因此,要序列化向量对象并通过网络发送它,我似乎找不到解释如何进行的入门指南。 还有其他替代方案可以用于此目的吗? 该向量将包含聊天组中每个成员的字符串(IP 地址:端口)。 任何帮助都会很棒。 谢谢。 注意:我们需要让聊天客户端在集群上运行,我相信为了使系统健壮和可扩展,我们还需要考虑字节序。 回答1 如果你想在这种情况下进行二进制序列化,你需要实现 2 种类型的序列化——整数和字符串。 Integer 可以很容易地逐字节写入,通过将其转换为 char 然后移位: // assuming 32 bit ints and 8 bit bytes int integer = 1337; unsigned char data[4]; for(int i = 0; i < 4; ++i) data[i] = (unsigned char) (integer >> 8*i); 按 sum 和 shift
  • 在C ++ std :: vector和C数组之间进行转换而无需复制(Converting between C++ std::vector and C array without copying)
    问题 我希望能够在std :: vector及其基础C数组int *之间进行转换,而无需显式复制数据。 std :: vector是否提供对底层C数组的访问? 我正在寻找这样的东西 vector<int> v (4,100) int* pv = v.c_array(); 编辑: 另外,是否有可能做相反的事情,即我如何在不复制的情况下从C数组初始化std::vector ? int pv[4] = { 4, 4, 4, 4}; vector<int> v (pv); 回答1 您可以按如下方式获得指向第一个元素的指针: int* pv = &v[0]; 只要不重新分配向量,此指针才有效。 如果您插入的元素超出了向量的剩余容量(即,如果v.size() + NumberOfNewElements > v.capacity() ,则会自动发生重新v.size() + NumberOfNewElements > v.capacity() 。您可以使用v.reserve(NewCapacity)来确保向量具有容量至少为NewCapacity 。 还要记住,当向量被销毁时,基础数组也将被删除。 回答2 在c ++ 11中,可以使用vector :: data()获取C数组指针。 回答3 int* pv = &v[0] 请注意,这仅是std::vector<> ,您不能对其他标准容器执行相同的操作
  • C++中将字符串转换为Cstring(Converting String to Cstring in C++)
    问题 我有一个要转换的string = "apple"并想将其放入这种样式的 C 字符串char *c ,该字符串包含{a, p, p, l, e, '\0'} 。 我应该使用哪种预定义方法? 回答1 .c_str()返回一个const char* 。 如果你需要一个可变版本,你需要自己制作一个副本。 回答2 vector<char> toVector( const std::string& s ) { string s = "apple"; vector<char> v(s.size()+1); memcpy( &v.front(), s.c_str(), s.size() + 1 ); return v; } vector<char> v = toVector(std::string("apple")); // what you were looking for (mutable) char* c = v.data(); .c_str() 适用于不可变。 该向量将为您管理内存。 回答3 string name; char *c_string; getline(cin, name); c_string = new char[name.length()]; for (int index = 0; index < name.length(); index++){ c_string
  • 将 OpenCV 的 findHomography 透视矩阵转换为 iOS 的 CATransform3D(Converting OpenCV's findHomography perspective matrix to iOS' CATransform3D)
    问题 我想采用从 OpenCV 的 findHomography 函数返回的透视变换矩阵并将其(在 C++ 或 Objective-C 中)转换为 iOS 的CATransform3D 。 我希望它们在 Core Graphics 端准确再现“扭曲”效果方面尽可能接近。 示例代码将不胜感激! 来自 iOS 的 CATransform3D.h: /* Homogeneous three-dimensional transforms. */ struct CATransform3D { CGFloat m11, m12, m13, m14; CGFloat m21, m22, m23, m24; CGFloat m31, m32, m33, m34; CGFloat m41, m42, m43, m44; }; 类似问题: 使用 Core Graphics 应用单应矩阵 将 opencv 仿射矩阵转换为 CGAffineTransform 回答1 免责声明 我从来没有试过这个,所以把它带上一粒盐。 CATRansform3D 是一个 4x4 矩阵,它对 3 维齐次向量 (4x1) 进行运算以生成另一个相同类型的向量。 我假设在渲染时,由 4x1 向量描述的对象将每个元素除以第 4 个元素,而第 3 个元素仅用于确定哪些对象出现在哪些对象之上。 假设这是正确的... 推理
  • 在 C++ 中将字符串向量转换为字符数组(Convert string vector to char array in c++)
    问题 我正在尝试将字符串向量转换为 C++ 中的字符数组。 更具体地说,我想要做的是使用以下命令拆分像“ls –latr”这样的shell命令: istringstream f(x); while (getline(f, x, ' ')) { strings.push_back(x); } 我相信这会给我strings[0] == "ls"和strings[1]==" -latr" 。 我正在尝试执行以下操作: execvp(strings[0], strings); 但是,我收到此错误: 错误:无法将参数 '1' 的 'std::basic_string, std::allocator >' 转换为 'const char*' 到 'int execvp(const char*, char* const*)' 因此,我试图弄清楚如何将字符串转换为字符数组。 回答1 阅读手册显示“ execvp提供了一个指向空终止字符串的指针数组”。 所以你需要创建这样一个数组。 这是一种方法: std::vector<char *> argv(strings.size() + 1); // one extra for the null for (std::size_t i = 0; i != strings.size(); ++i) { argv[i] = &strings[i][0]; }
  • 将浮点向量重新解释为无符号字符数组并返回(Reinterpret float vector as unsigned char array and back)
    问题 我已经在 stackoverflow 上搜索并搜索了答案,但没有找到我需要的。 我有一个例程,它将一个无符号字符数组作为参数,以便将其编码为 Base64。 我想在 Base64 中对 STL 浮点向量(向量)进行编码,因此需要将浮点向量中的字节重新解释为无符号字符数组,以便将其传递给编码例程。 我已经尝试了很多东西,从重新解释和静态转换到内存副本等,但它们似乎都不起作用(至少不是我实现它们的方式)。 同样,在将编码数据解码回浮点数组时,我需要做完全相反的事情。 解码例程将解码数据作为无符号字符数组提供,我需要重新解释该字节数组,再次将其转换为浮点向量。 这是我的 C++ 代码的精简版本,用于进行编码: std::string EncodeBase64FloatVector( const vector<float>& p_vector ) { unsigned char* sourceArray; // SOMEHOW FILL THE sourceArray WITH THE FLOAT VECTOR DATA BITS!! char* target; size_t targetSize = p_vector.size() * sizeof(float); target = new char[ targetSize ]; int result = EncodeBase64(
  • C ++将字符串转换为双精度(C++ Converting a String to Double)
    问题 我整天都在努力寻找解决方案! 您可能将其标记为重新发布,但是我真正想要的是不使用boost lexical cast的解决方案。 一种传统的C ++实现方式会很棒。 我尝试了这段代码,但是它返回了一组乱码和字母。 string line; double lineconverted; istringstream buffer(line); lineconverted; buffer >> lineconverted; 我也尝试过此方法,但始终返回0。 stringstream convert(line); if ( !(convert >> lineconverted) ) { lineconverted = 0; } 提前致谢 :) 编辑:对于我使用的第一个解决方案(乱码)..这是一个快照 回答1 #include <sstream> int main(int argc, char *argv[]) { double f = 0.0; std::stringstream ss; std::string s = "3.1415"; ss << s; ss >> f; cout << f; } 好消息是,此解决方案也适用于其他对象,例如int等。 如果要重复使用相同的缓冲区,则必须在两者之间进行ss.clear 。 还有一个更短的解决方案,您可以将值初始化为字符串流
  • c++ - 如何在'z'之外增加c ++中的字母组合?(How to increment letter combinations in c++ beyond 'z'?)
    问题 我正在处理 Excel 电子表格,对于大量数据,我只需要使用一种类型的公式。 由于在公式中唯一必要的更改涉及字母,我想知道是否有一种方法可以使程序按照 Excel 列顺序(A、B、C...Z;AA、AB、AC... AZ;BA、BB、BC...BZ)。 就我而言,我需要每次将字母增加 5,所以这是我想要获得的代码类型: #include <iostream> using namespace std; int main() { char x = 'B'; char y = 'E'; for (int z = 1; z < 2255; z++) { cout << "=SUMPRODUCT(SUBTOTAL(4,OFFSET(" << x << "1:" << y << "1,ROW(" << x << "1:" << x << "100)-ROW(" << x << "1),)))" << endl; x = x + 5; y= y + 5; } return 0; } 当然它不会工作,因为它超过了'z',但是,有没有办法做到这一点? 回答1 一般解决方案说明 解决方案 1:创建 base-26 系统本身: 假设您有 26 个字母。 所以首先让我们制作26个数字系统。 我们为每个数字使用 1 个字节。 我们创建了一个数字数组,然后当添加超过26个时我们有时需要调整。
  • 创建一个 x86 汇编程序,将整数转换为 0 和 1 的 16 位二进制字符串(Creating an x86 assembler program that converts an integer to a 16-bit binary string of 0's and 1's)
    问题 正如问题所暗示的那样,我必须编写一个 MASM 程序来将整数转换为二进制。 我尝试了许多不同的方法,但没有一个对我有帮助。 我正在处理的最终代码如下。 在Visual Studio 中调试代码时出现访问内存冲突错误。 关于如何解决错误以及我是否在正确的轨道上的任何帮助将不胜感激。 第一个代码是我的 C++ 代码,它将字符数组传递给要转换为二进制的.asm文件。 #include <iostream> using namespace std; extern "C" { int intToBin(char*); } int main() { char str[17] = { NULL }; for (int i = 0; i < 16; i++) { str[i] = '0'; } cout << "Please enter an integer number :"; cin >>str; intToBin(str); cout << " the equivilant binaryis: " << str << endl; return 0; } .asm文件如下: .686 .model small .code _intToBin PROC ;name of fucntion start: push ebp ; save base pointer mov ebp, esp
  • 将结构转换为字节向量(Convert a struct to vector of bytes)
    问题 在我的 C++ 应用程序中,我有这个结构 typedef struct { int a; int b; char *c }MyStruct 我有这个例子: MyStruct s; 我也有这个定义: vector<byte> buffer; 我想将“s”结构插入\转换为缓冲区向量。 在 C++ 中最好的方法是什么? 谢谢 回答1 最好的方法是使用范围复制构造函数和低级强制转换来检索指向结构内存的指针: auto ptr = reinterpret_cast<byte*>(&s); auto buffer = vector<byte>(ptr, ptr + sizeof s); 反过来,您可以将字节缓冲区强制转换为目标类型(但它必须是相同类型,否则您将违反严格别名): auto p_obj = reinterpret_cast<obj_t*>(&buffer[0]); 但是,对于索引 ≠ 0(我猜技术上也为索引 = 0,但这似乎不太可能)要注意内存对齐不匹配。 因此,更安全的方法是首先将缓冲区复制到正确对齐的存储中,然后从那里访问指针。
  • C++ 向量到 Python 3.3(C++ vector to Python 3.3)
    问题 我想从 C++ 脚本中获取 python 列表,例如[1,2,3,4] 。 我写了 C++ 脚本,它返回一个向量。 如何在没有 SWIG/SIP/Cython/等的情况下连接末端? 将 C++ 编译为 .exe 或 elf 文件,然后从命令行调用,让 .exe 创建一个包含向量的 .txt 并用 python 读取它会更容易吗? 我的观点是,我只需要一个来自 C++ 的非常小的函数来对大量数据进行大量计算。 做到这一点的最不痛苦和最短的方法是什么? 编辑:举个例子。 Python 会给 C++ 提供一个文件名字符串(“foo.txt”),然后 C++ 将读取文件的上下文(200,000 行 x 300 列),计算缺失值,然后将每行缺失值的数量返回给 Python。 这会产生一个包含 200,000 个数字的列表。 两者之间如何进行这种通信? 为了完整起见,这就是我仍然想知道如何去做的事情: 将 python 文件名字符串传递给 C++ 在 C++ 中接收 python 字符串完成在 C++ 中创建向量将向量返回给 Python 在 Python 中接收向量 回答1 这现在可能没有实际意义,我在你的另一个问题上发布了类似的内容,但我已经针对 Python 3.3 和 C++ 而不是 Python 2.7 和 C 调整了这个版本。 如果您想取回 Python 列表对象
  • 如何在 CUDA 中使用 uint4 向量正确投射全局内存阵列以增加内存吞吐量?(How to properly cast a global memory array using the uint4 vector in CUDA to increase memory throughput?)
    问题 通常有两种技术可以在计算能力为 1.3 GPU 的 CUDA 内核上增加全局内存的内存吞吐量; 内存访问合并和访问至少 4 个字节的字。 使用第一种技术,相同 half-warp 的线程对同一内存段的访问合并为更少的事务,同时访问至少 4 个字节的字,此内存段有效地从 32 个字节增加到 128 个。 更新:基于 talonmies 答案的解决方案。 当全局内存中存储有无符号字符时,要访问 16 字节而不是 1 字节的字,通常通过将内存数组强制转换为 uint4 来使用 uint4 向量。 要从 uint4 向量中获取值,可以将其重新转换为 uchar4,如下所示: #include <cuda.h> #include <stdio.h> #include <stdlib.h> __global__ void kernel ( unsigned char *d_text, unsigned char *d_out ) { int idx = blockIdx.x * blockDim.x + threadIdx.x; extern __shared__ unsigned char s_array[]; uint4 *uint4_text = reinterpret_cast<uint4 *>(d_text); uint4 uint4_var; //memory
  • C++ 向量到逗号分隔的字符串? [复制](c++ vector to comma delimitated string? [duplicate])
    问题 这个问题在这里已经有了答案: 8 年前关闭。 可能的重复: 通过在每个元素后添加逗号将 C++ Vector 转换为 CSV 我有一个向量: std::vector<std::pair<int, QString> > recordingArray; 我需要将它转换为逗号分隔的字符串,以便我可以将其存储在数据库中(是否有更好的数据格式 - 所有这些都需要放在一个字段中) 如何将其转换为逗号分隔的字符串? 然后再转换回来? 回答1 为此使用std::transform和std::stringstream 。 std::stringstream str; std::transform( recordingArray.begin(), recordingArray.end(), std::ostream_iterator<std::string>(str, ", "), [](const std::pair<int, QString> &p) { return std::to_string(p.first) + ", " + p.second.toStdString(); }); 回答2 string line = ""; auto it = recordingArray.begin(); while(it != recordingArray.end()) { line.append
  • reinterpret_cast 更改指针值的任何真实示例?(Any real example of reinterpret_cast changing a pointer value?)
    问题 根据 C++ 标准,指针T*到其他类型指针Q*的reinterpret_cast可以更改或不更改指针值,具体取决于实现。 我很感兴趣 - 是否有 C++ 实现的真实示例,其中使用reinterpret_cast将指针转换为其他指针类型会更改指针? 什么以及为什么在那里改变? 回答1 请注意,当标准声明它可以或不能做某事时,并不意味着当前的任何实现都具有该行为,只是它们可以。 我能想到的最接近的是硬件需要类型对齐的架构,以及在需要时决定纠正对齐的实现。 就像是: aligned8 var; aligned1 *p = reinterpret_cast<aligned1*>(&var); aligned1 *q = p + 1; // assuming aligned 1 size is not multiple of 8 aligned8 *a = reinterpret_cast<aligned8*>(q); // [1] 可能要求a成为有效指针,它必须寻址 8 的倍数内存位置,而具有较少对齐要求的参数q可以指向任何内存地址。 回答2 class A1 { int a1; }; class A2 { int a2; }; class B: public A1, public A2 { }; #define DBG(val) cout << #val << ": " <<
  • Haskell Thrift 库在性能测试中比 C++ 慢 300 倍(Haskell Thrift library 300x slower than C++ in performance test)
    问题 我正在构建一个包含两个组件的应用程序 - 用 Haskell 编写的服务器和用 Qt (C++) 编写的客户端。 我正在使用 thrift 来传达它们,我想知道它为什么工作这么慢。 我做了一个性能测试,这是我机器上的结果 结果 C++ server and C++ client: Sending 100 pings - 13.37 ms Transfering 1000000 size vector - 433.58 ms Recieved: 3906.25 kB Transfering 100000 items from server - 1090.19 ms Transfering 100000 items to server - 631.98 ms Haskell server and C++ client: Sending 100 pings 3959.97 ms Transfering 1000000 size vector - 12481.40 ms Recieved: 3906.25 kB Transfering 100000 items from server - 26066.80 ms Transfering 100000 items to server - 1805.44 ms 为什么 Haskell 在这个测试中这么慢? 我怎样才能提高它的性能?
  • C++ sizeof Vector 是 24?(C++ sizeof Vector is 24?)
    问题 我只是在胡闹,学习向量和结构体,有一次,我尝试以字节为单位输出向量的大小。 这是代码: #include <iostream> #include <vector> struct Foo{ std::vector<int> a; }; int main() { using std::cout; using std::endl; Foo* f1 = new Foo; f1->a.push_back(5); cout << sizeof(f1->a) << endl; cout << sizeof(f1->a[0]) << endl; delete[] f1; } 输出是24和4 。 显然第二行打印了 4,因为这是一个 int 的大小。 但为什么另一个值是 24? 向量是否占用 24 字节的内存? 谢谢! 回答1 虽然std::vector定义了std::vector的公共接口,但是可以有不同的实现方式:换句话说, std::vector的std::vector可以在实现方式之间变化。 即使在相同的实现中(例如:给定版本的 Visual C++ 附带的 STL 实现), std::vector的内部结构也可能因发布版本和调试版本而异。 您看到的24个大小可以解释为3个指针(在64位体系结构上,每个指针的大小为8个字节;因此,您有3 x 8 = 24个字节)。 这些指针可以是:
  • 直接在C ++ std:vector中使用read()(Using read() directly into a C++ std:vector)
    问题 我在一些C ++中为嵌入式系统包装了用户空间linux套接字功能(是的,这可能是在重新发明轮子)。 我想提供一个使用向量的读写实现。 进行写入非常容易,我可以通过&myvec[0]并避免不必要的复制。 我想做同样的事情,直接读入向量,而不是读入char缓冲区,然后将所有内容复制到新创建的向量中。 现在,我知道要读取多少数据,并且可以适当分配( vec.reserve() )。 我也可以读入&myvec[0] ,尽管这可能是一个非常糟糕的想法。 显然,这样做不允许myvec.size返回任何明智的方法。 有什么办法做到这一点: 从安全/ C ++的角度来看并不完全令人讨厌不涉及数据块的两个副本-一次从内核到用户空间,一次从C char *样式缓冲区到C ++向量。 回答1 使用resize()而不是reserve() 。 这将正确设置向量的大小-然后, &myvec[0]往常一样,保证&myvec[0]指向连续的内存块。 编辑:将&myvec[0]用作指向基础数组的指针,以便进行读写是安全的,并且可以保证按C ++标准工作。 这是赫伯·萨特(Herb Sutter)所说的: 那么为什么人们不断问std :: vector(或std :: array)的元素是否连续存储? 最可能的原因是,他们想知道是否可以咳出指向内部的指针,以与处理C数组的其他代码共享数据,以便进行读取或写入。
  • 将浮点向量转换为字节向量并返回(Convert float vector to byte vector and back)
    问题 我正在尝试在 float 和 unsigned char 数组(在本例中为 std::vector )之间进行一些转换,但遇到了一些麻烦。 我已经像这样将浮点数向量转换为无符号字符...... vector<float> myFloats; myFloats.push_back(1.0f); myFloats.push_back(2.0f); myFloats.push_back(3.0f); const unsigned char* bytes = reinterpret_cast<const unsigned char*>(&floats[0]); vector<unsigned char> byteVec; for (int i = 0; i < 3; i++) byteVec.push_back(bytes[i]); 我希望我已经正确地完成了这件事,否则这将是下一部分无法正常工作的原因。 // converting back somewhere later in the program unsigned char* bytes = &(byteVec[0]); // point to beginning of memory float* floatArray = reinterpret_cast<float*>(*bytes); for (int i = 0; i <
  • C++ 将向量向量的元素推入向量中(C++ pushing elements of a vector of vectors into a vector)
    问题 我只是想知道是否有一种简单快捷的方法可以在向量中插入向量向量的元素。 例如: std::vector<std::vector<double> > vals { {1, 2, 3, 4, 5, 6}, {1, 2, 3, 4, 5, 6} }; std::vector<double> myvector; 所以myvector将包含: 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6 我试过使用insert和push_back但没有运气。 编辑: 我用过: myvector.insert(vals.begin(), vals.end()); - 没有匹配的成员函数来调用“插入” 回答1 尝试 // c++11 for(auto && v : vals){ myvector.insert(myvector.end(), v.begin(), v.end()); } // non c++11 for(std::vector<std::vector<double> >::const_iterator it = vals.begin(), end = vals.end(); it != end; ++it){ myvector.insert(myvector.end(), it->begin(), it->end()); } 回答2 根据您的向量向量最初是如何构建的
  • 在C ++中将变量名转换为字符串(converting a variable name to a string in C++)
    问题 我想将一些数据输出到文件中。 例如,假设我有两个双精度向量: vector<double> data1(10); vector<double> data2(10); 有没有一种简单的方法可以将其输出到文件,以便第一行包含标题“ data1”和“ data2”,后跟实际内容。 输出数据的函数将通过各种不同的数组传递,因此无法对标题的名称进行硬编码-理想情况下,我想将变量名称转换为某个字符串,然后输出该字符串,然后输出矢量数组的内容。 但是,我不确定如何将变量名“ data1”转换为字符串,或者实际上是否可以轻松实现(从阅读论坛我的猜测是不可能的)。使用诸如地图之类的关联容器,或者更简单地使用“成对”容器。 pair<vector<double>,string> data1(10,'data1'); 欢迎大家提出意见! 回答1 您可以使用预处理器“ stringify” #来执行所需的操作: #include <stdio.h> #define PRINTER(name) printer(#name, (name)) void printer(char *name, int value) { printf("name: %s\tvalue: %d\n", name, value); } int main (int argc, char* argv[]) { int foo = 0