qq_39610896 2024-07-26 23:30 采纳率: 56.3%
浏览 13
已结题

关于arduino编程toCharArray()函数的使用


char inn[10][8];
String reed;
int okkk=0;
void trans_form(String reed)
{
  ...
  reed.toCharArray(inn[n],reed.length()+1);
  ...
  n++;
}
void setup()
{
  Serial.begin(9600);
}
void loop()
{ 
  if(okkk==0)
    {
      reed="火龙果,2023.12.12,150天,冷藏层";
      tran_form(reed);
      reed="冰激凌,2024.6.7,150天,冷冻层";
      tran_form(reed);
      reed="大虾,2024.6.7,150天,冷冻层";
      tran_form(reed);
      reed="小腊肠,2023.6.7,150天,冷藏层";
      tran_form(reed);
      reed="三明治,2024.7.7,100天,冷藏层";
      tran_form(reed);
      reed="酸奶,2024.6.7,21天,冷藏层";
      tran_form(reed);
      okkk=1;
    }
}

部分关键代码如上,想知道为什么reed的实际长度超过了30,inn二维字符数组的第二维存储空间不超过30,远远不足够存储,但是却不影响正常存储呢,inn[n]的存储空间到底为多少,为什么声明inn[10][4]就不行了呢?

  • 写回答

17条回答 默认 最新

  • 小雪人^_^ 2024-07-27 15:35
    关注

    引用gpt4
    在你的代码中,inn 是一个 char 类型的二维数组,定义如下:

    char inn[10][8];
    

    这意味着 inn 是一个包含 10 个数组的数组,每个子数组可以存储 8 个 char 类型的数据。这里的 8 包含了字符串的终止符 \0。也就是说,每个字符串最多只能包含 7 个字符(加上一个终止符)。

    在你的代码中,toCharArray 函数将 String 类型的数据转换为 char 类型的数组。例如:

    reed.toCharArray(inn[n], reed.length() + 1);
    

    这个函数将 reed 的内容复制到 inn[n] 中。reed.length() + 1 是为了包括字符串终止符 \0

    问题分析

    1. 实际长度超过 8 字节
      reed 字符串的实际长度远远超过了 8 字节。在这种情况下,toCharArray 函数将会超出 inn[n] 的边界。这会导致未定义行为,因为你在写入数组边界之外的内存。

    2. 为什么声明 inn[10][4] 不行
      inn[10][4] 只能容纳每个字符串的 3 个字符加上一个终止符。在这种情况下,你的 reed 字符串会更容易超出数组的边界,从而更明显地导致未定义行为或者程序崩溃。

    正确的解决方法

    确保每个子数组有足够的长度来容纳最长的字符串。根据你的示例数据,最长的字符串大约有 20 多个字符。因此,子数组的长度应该足够大,例如 40 或更多。

    char inn[10][40]; // 每个子数组长度设置为 40,足够存储最长的字符串
    

    完整示例代码

    char inn[10][40]; // 调整子数组的长度
    String reed;
    int okkk = 0;
    int n = 0; // 确保有一个计数器来更新数组的索引
    
    void tran_form(String reed) // 修正函数名为 tran_form 以与调用匹配
    {
      reed.toCharArray(inn[n], reed.length() + 1);
      n++;
    }
    
    void setup()
    {
      Serial.begin(9600);
    }
    
    void loop()
    { 
      if(okkk == 0)
      {
        reed = "火龙果,2023.12.12,150天,冷藏层";
        tran_form(reed);
        reed = "冰激凌,2024.6.7,150天,冷冻层";
        tran_form(reed);
        reed = "大虾,2024.6.7,150天,冷冻层";
        tran_form(reed);
        reed = "小腊肠,2023.6.7,150天,冷藏层";
        tran_form(reed);
        reed = "三明治,2024.7.7,100天,冷藏层";
        tran_form(reed);
        reed = "酸奶,2024.6.7,21天,冷藏层";
        tran_form(reed);
        okkk = 1;
      }
    }
    

    解释

    • **char inn[10][40]**:将子数组长度增加到 40,这样可以确保每个 reed 字符串可以安全存储,不会超出边界。
    • 修正函数名:将 trans_form 修改为 tran_form,以与调用代码一致。
    • **计数器 n**:确保每次调用 tran_form 时,正确地递增索引 n

    通过这些修改,你可以确保 inn 数组有足够的空间存储所有的 reed 字符串,并且不会导致未定义行为或内存越界问题。

    评论

报告相同问题?

问题事件

  • 系统已结题 8月3日
  • 创建了问题 7月26日

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上