【问题标题】:Making an array of char[] in C在 C 中创建一个 char[] 数组
【发布时间】:2013-05-23 14:55:25
【问题描述】:

我正在使用需要提供大型 (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]')”。两者都出现在显示的最后一行。

【问题讨论】:

  • 初始化器使用{},而不是[]
  • 有用提示:C 预处理器对字符串文字执行自动连接。所以你可以把你的代码写成char HTML_ID_96[] =(新行)"&lt;p&gt;&lt;a href=\"#t\"&gt;Return to top&lt;/a&gt;&lt;/p&gt;"(新行)"&lt;a id=\"id9\"/&gt;"(新行)。等等。不需要讨厌的反斜杠。
  • 扩展名见stackoverflow.com/questions/3025050——你需要HTML_ID_*标识符,还是直接说char *all [] = { "String 1", "String 2", ... };
  • @chirlu 是的,我确实需要所有这些标识符。根据微控制器的类型,我需要不同的字符串序列。我计划使用大部分相同的字符串构建至少两个序列。
  • 然后以编程方式设置数组 (all[0] = HTML_ID_1; all[1] = HTML_ID_2; ...) 或 #define 字符串(但您可能需要一个巧妙的链接器来合并相同的字符串文字)。

标签: c string variable-assignment


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    指向字符串的指针数组:

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

    【讨论】:

    • 行终止符(行尾'\')在编译时会变成换行符吗?
    • @waldol1:我的错误 - 结果字符串没有区别,所以我删除了最后一位。
    • 好的,现在我正在尝试像您建议的那样声明char const* id = "..."; 如何声明这些类型的数组?我的直觉说应该是char const* all[] = {...};,但编译器不同意。
    • @waldol1:这对我来说很合适(并且在这里工作)。确切的错误信息是什么?您使用的是什么编译器?
    【解决方案3】:

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

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

    An example

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

    【讨论】:

    • 这可能行得通,但是不同版本的控制器需要不同的html小节,所以我需要能够动态拼接它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    相关资源
    最近更新 更多