1

我正在使用需要提供大型(20kb)静态 html 页面的 wifi 微控制器。由于微控制器上的单个缓冲区仅保存 1.4kb,因此有必要将 html 分成块并一次发送一个块。

我现在拥有的是大约 100 个字符串分配,如下所示:

char HTML_ID_96[] = "\
<p><a href=\"#t\">Return to top</a></p>\
<a id=\"id9\"/>\
<span class=\"s\">Firmware Version/Information</span>\
<span class=\"c i\" id=\"id9-h\" onclick=\"h(\'id9\');\">hide</span>&nbsp;\
<span class=\'c\' id=\"id9-s\" onclick=\"s(\'id9\');\">show</span>\
<table class=\"t i\" id=\"id9-table\"><tbody>\
";

我想要一种通过将所有字符串粘贴在数组中来对所有字符串施加可迭代序列的方法,但我不确定如何打包它们。

我努力了:

char** all = [HTML_ID_1, ..., HTML_ID_99];
char* all[] = [HTML_ID_1, ..., HTML_ID_99];
char all[][] = [HTML_ID_1, ..., HTML_ID_99];

但是它们都没有编译。任何对 C 如何处理数组的引用都是一种奖励。

扩大:

char const* HTML_ID_100 = "\
</form>\
</body>\
</html>\
";

char const* all[] = {HTML_ID_100};

不编译。我正在使用 gcc 3.4.4。报告了两个错误:“initializer element is not constant”和“(near initialization for 'all[0]')”。两者都发生在所示的最后一行。

4

3 回答 3

8

使用大括号进行数组初始化。

char* all[] = { HTML_ID_1, ..., HTML_ID_99 };
于 2013-05-23T15:00:24.397 回答
4

指向字符串的指针数组:

char* all[] = {HTML_ID_1, ..., HTML_ID_99};

请注意,您可能希望使用 NULL 指针终止数组,具体取决于您将如何迭代数组:

char* all[] = {HTML_ID_1, ..., HTML_ID_99,NULL};

此外,如果不打算修改字符串,您可以通过将它们声明为指向文字字符串的简单指针而不是由文字初始化的 char 数组来节省一些数据空间:

char const* HTML_ID_96 = "\
<p><a href=\"#t\">Return to top</a></p>\
<a id=\"id9\"/>\
<span class=\"s\">Firmware Version/Information</span>\
<span class=\"c i\" id=\"id9-h\" onclick=\"h(\'id9\');\">hide</span>&nbsp;\
<span class=\'c\' id=\"id9-s\" onclick=\"s(\'id9\');\">show</span>\
<table class=\"t i\" id=\"id9-table\"><tbody>\
";
于 2013-05-23T15:06:28.833 回答
2

您走在正确的轨道上,但您需要使用花括号来声明静态数组。这应该有效:

char* all[] = {HTML_ID_1, ..., HTML_ID_99};

一个例子

我会考虑您在做什么,以及是否有更好的方法来做到这一点。例如,如果它是一个微型的,你能在程序存储器(即 NVRAM)中制作一个大数组并从它串行读取吗?

于 2013-05-23T15:04:55.430 回答