【问题标题】:Using char* to store data and error produced使用 char* 存储数据和产生的错误
【发布时间】:2020-10-14 18:13:27
【问题描述】:
const char* val1 = advertisedDevice.getAddress().toString().c_str();
Serial.printf("Advertised Device: %s \n", val1);

此代码用于检索 BLE 设备的 MAC 地址。 串口监视器上val1的输出为:

广告设备:45:89:a2:d8:74:65

但是当我尝试单独输出val1 时,系统崩溃了。代码如下所示。这是为什么呢?

Serial.printf("Val is : %s", val1[0]);

我应该期待串行监视器打印出来

数值为:4

我也在尝试存储val1是一个字符串数组,所以例如

伪代码

String arr[50];
loop{
    const char* val1 = advertisedDevice.getAddress().toString().c_str();
    Serial.printf("Advertised Device: %s \n", val1);

    arr[i] = val1[0]+val1[1]+val1[2]+....+val1[18]
    i++;
}

我想将它存储在一个数组中,因为然后我将它上传到数据库。如果它的形式是 val1[0],val1[1]... 等等,我不能这样做。将所有数据存储在单个数组位置会更容易,即

arr[1] = "45:47:89:fd:12", 
arr[2] = "47:AC:1b:24:58" and so on. 

是这样吗?

【问题讨论】:

  • 最后一行将它们加在一起有什么意义?为什么你觉得你需要五十个 String 对象呢?
  • @Delta_G 我想将它存储在一个数组中,因为然后我将它上传到数据库。如果它的形式是 val1[0],val1[1]... 等等,我不能这样做。将所有数据存储在单个数组位置会更容易,即 arr[1] = "45:47:89:fd:12", arr[2] = "47:AC:1b:24:58" 等等在。我还想存储 50 个 MAC 地址

标签: c++ arrays arduino char


【解决方案1】:
Serial.printf("Val is : %s", val1[0]);

%s 需要一个字符串,即char *const char * 变量。 val1const char *,所以 val1[0]char,它是 val1 中的第一个字符。您需要将%s 更改为%c,否则Serial.printf 会认为val1[0] 的值是字符串的地址,从而导致崩溃或未定义的行为。

如果你的意思是val1 是一个字符串数组,你需要这样声明它。例如:

const char *val1[50];
val1[0] = advertisedDevice.getAddress().toString().c_str();
Serial.printf("Val is : %s", val1[0]); // Now this will work

编辑:如果您希望从arr 构建字符串列表,您应该能够简单地分配给arr 并通过它访问字符串:

String arr[50];
loop{
    arr[i] = advertisedDevice.getAddress().toString().c_str();
    // If above doesn't work, try: arr[i] = String(...);
    Serial.printf("Advertised Device: %s \n", arr[i]);

    i++;
}

【讨论】:

  • 您的解释是正确的,但您的解决方法不正确。无需将val1 设为字符串数组,而且无论哪种方式,在对象生命周期结束后它仍然会访问无效内存。
猜你喜欢
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
相关资源
最近更新 更多