如何创建C++;具有基本类型的多维名称数组 我试图用连续内存中的基本类型实例化并轻松访问C++中的一组名称。我很惊讶,这是非常困难的或复杂的,在C++中只使用基本类型。

如何创建C++;具有基本类型的多维名称数组 我试图用连续内存中的基本类型实例化并轻松访问C++中的一组名称。我很惊讶,这是非常困难的或复杂的,在C++中只使用基本类型。,c++,C++,在某些背景下,我正在编程一个内存有限、处理能力适中的微控制器,它通过网络与36个其他微控制器进行串行通信,发送连续的传感器数据,并上传到Web服务器。数据的刷新率越短越好,所以我更喜欢基本的程序功能 我并不是说我在其他论坛上寻找的更复杂的东西,比如字符串数组,已经奏效了 在我的绝望中,我成功地使这一切得以实现 char names_array[] = "Bob\0\0Carl"; printf("%s",names_array); //outputs Bob printf("%s",names_

在某些背景下,我正在编程一个内存有限、处理能力适中的微控制器,它通过网络与36个其他微控制器进行串行通信,发送连续的传感器数据,并上传到Web服务器。数据的刷新率越短越好,所以我更喜欢基本的程序功能

我并不是说我在其他论坛上寻找的更复杂的东西,比如字符串数组,已经奏效了

在我的绝望中,我成功地使这一切得以实现

char names_array[] = "Bob\0\0Carl";
printf("%s",names_array); //outputs Bob
printf("%s",names_array + 5); //outputs Carl
但这是一个可怕的解决方案。我的索引依赖于数组中最长的名称,因此如果我将“Megan”添加到名称列表中,我必须在整个数组中添加一组空字符

我想做的是这样的:

char names_array[2] = {"Bob","Carl"}; //does not compile
printf("%s",names_array[0]);
printf("%s",names_array[1]);
//Error: A value of type "const char *" cannot be used to
//initialize an entity of type "char" in "main.cpp"

#include <string_view>

using namespace std::literals;

constexpr std::string_view names[] = {
    "Bob"sv,
    "Carl"sv
};
但那没用

我想循环遍历列表中的名称,并对每个名称进行处理,因此在这一点上,这是我的最佳解决方案

char name0[] = "Bob";
loop_code(name0);
char name1[] = "Carl";
loop_code(name1);
.
.
.

我希望有一种合理的方法来生成指针数组,每个指针指向以null结尾的字符数组。我一定是做错了什么。我不相信像C++这样的语言是不可能有这样一个基本的内存分配的。

char只能有一个字符。

如果你想使用char,你可以这样做

char name0[3] = "Bob";
char name1[4] = "Carl";
char *nameptr[2] = {&name0[0], &name1[0]};
事实上,这很难

我建议您使用std::string

std::string name[2] = {"Bob","Carl"};

此代码是可以接受的。

例如,您可以获取指向以null结尾的字符串的指针数组:

const char* names_array[] = { "Bob", "Carl" };
然后

std::printf("%s", names_array[0]);
std::printf("%s", names_array[1]);
你尝试的问题

char names_array[2] = {"Bob","Carl"};
names\u array
声明为字符数组。这是因为
={“Bob”,“Carl”}
本质上试图做的是用自己的整个字符数组初始化该字符数组中的每个字符。字符只是一个字符,不能将整个字符数组仅指定给单个字符。更准确地说,从字符串文本初始化字符数组是一种特殊的初始化情况,它允许使用单个字符串文本初始化整个字符数组(因为其他任何东西都没有意义)。您实际需要的是更像一个字符数组的数组。但是,问题是您必须为数组中的所有字符串有效地选择一个固定的最大长度:

char names_array[][5] = { "Bob", "Carl" };  // each subarray is 5 characters in length
这可能会造成浪费。您可以将一系列多个字符串展平为一个长数组,然后索引到该数组中,就像第一种方法一样。正如您所发现的,这样做的缺点是,您需要知道数组中每个字符串的起始位置

如果你只想要一个字符串常量数组,一个更现代的C++方法会是这样的:

char names_array[2] = {"Bob","Carl"}; //does not compile
printf("%s",names_array[0]);
printf("%s",names_array[1]);
//Error: A value of type "const char *" cannot be used to
//initialize an entity of type "char" in "main.cpp"

#include <string_view>

using namespace std::literals;

constexpr std::string_view names[] = {
    "Bob"sv,
    "Carl"sv
};
#包括
使用名称空间std::literals;
constexpr std::string_视图名称[]={
“鲍勃”sv,
“卡尔”sv
};

的优点是,它还具有有关字符串长度的信息。然而,虽然<>代码STD::StrigyVIEW 与大多数处理字符串的C++标准库设施兼容,但它与使用C风格的空结尾字符串的函数一起使用并不那么简单。如果您需要以null结尾的字符串,我建议您只需使用指向字符串的指针数组,如本答案开头所示…

您确定
char names\u array[2]={“Bob”,“Carl”}编译过吗?因为它不应该。如果是这样的话,你应该认真考虑切换到一个更有用的编译器…<代码> char NAMESYARSARD[[ 2 ] <代码> = >代码> const char *NAMESY数组[2 ] < /代码>这是很复杂的,因为你没有使用语言的特性来使它更容易。但既然这是你的限制,那并不是说这是不可能的,但这只是为了解释为什么这可能会更难。但那不起作用——我认为这个问题可能会因为一个打字错误而结束,除了C++ ISO警告外,文本没有被篡改。看起来你想用C++作为荣耀C。那很好。可以使用以零结尾的字符串并初始化指针数组。但要小心,不能保证它们会传染。或者您可以有一个带有分隔符的大字符串。如果您只想在列表上迭代即可。Nit
const char*names\u array[]
最好是
const char*names\u array[]
。不太可能引起混淆,例如,
char*a、b、c
不声明3个指针
char*a,b,c
清楚地表明了这一点。OP非常具体地说,他们只希望使用基本类型,所以
std::string
已经过时了。