gpt4 book ai didi

c++ - 如何创建具有基本类型的名称的 C++ 多维数组

转载 作者:行者123 更新时间:2023-11-28 04:18:54 24 4
gpt4 key购买 nike

我正在尝试使用连续内存中的基本类型实例化并轻松访问 C++ 中的名称数组。令我惊讶的是,在仅使用基本类型的 C++ 中做到这一点极其困难或复杂。

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

并不是说我在其他论坛中寻找的更复杂的东西(例如字符串数组)已经奏效。

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

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(s) 结尾的字符数组。我一定做错了什么。我不相信像 C++ 这样的语言无法进行这种基本的内存分配。

最佳答案

例如,您可以获得一个指向空终止字符串的指针数组:

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 结尾的字符串,我建议您简单地使用一个指向字符串的指针数组,如本答案开头所示……

关于c++ - 如何创建具有基本类型的名称的 C++ 多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55912720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com