如何使用基本类型创建名称的C ++多维数组

问题描述 投票:0回答:2

我正在尝试使用连续内存中的基本类型实例化并轻松访问C ++中的名称数组。令我震惊的是,在C ++中使用ONLY基本类型这是非常困难或复杂的。

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

并不是说我在其他论坛中看到的更复杂的东西,比如一串字符串,已经奏效了。

在我的绝望中,我能够让它发挥作用。

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"

但那没用。

我想遍历列表中的名称并对每个名称执行一些操作,所以此时,这是我最好的解决方案。

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

我希望有一种合理的方法来创建一个指针数组,每个指针都由一个以null结尾的char数组。我一定做错了什么。我拒绝相信像C ++这样的语言无法进行这样的基本内存分配。

c++
2个回答
1
投票

例如,您可以获取一个指向以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_array是一个字符数组。这个should never compile因为= {"Bob","Carl"}本质上试图做的是用它自己的整个字符数组初始化该字符数组中的每个字符。字符只是一个字符,您不能将整个字符数组分配给单个字符。更准确地说,从字符串文字初始化字符数组是初始化[dcl.init.string]的一个特例,它允许使用单个字符串文字来初始化整个字符数组(因为其他任何东西都没有意义)。你真正想要的是更像是一组字符数组。但是,问题在于您必须为数组中的所有字符串有效地选择固定的最大长度:

char names_array[][5] = { "Bob", "Carl" };  // each subarray is 5 characters in length

这可能是浪费。您可以将一系列多个字符串压缩成一个长数组,然后将其编入索引,就像使用第一种方法一样。正如您所发现的那样,缺点是您需要知道每个字符串在该数组中的起始位置......

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

#include <string_view>

using namespace std::literals;

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

std::string_view的优势在于它还具有关于字符串长度的信息。但是,虽然std::string_view与处理字符串的大多数C ++标准库工具兼容,但将它与期望C样式的以null结尾的字符串的函数一起使用并不是那么简单。如果你需要以null结尾的字符串,我建议只使用一个指向字符串的指针数组,如本答案的开头所示......


0
投票

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"};

这段代码是可以接受的

© www.soinside.com 2019 - 2024. All rights reserved.