【C系列6.21】字符串训练之AB串

字符串中查找非重叠的AB和BA,

Description

无聊的wxa又开始玩字符串了,现在他有一个字符串s,他想知道这个字符串是否含有非重叠AB和BA。(如ABA里AB和BA是重叠的,而ABBA里AB和BA是不重叠的)

Input

输入数据有多组。

每组测试数据有一个字符串s。

Output

如果可以找到AB和BA,输出”yu ye sa wang dai xing”,否则输出”zhen shi ou ba”

Samples

input Copy

ABA

output Copy

zhen shi ou ba

AC代码

#include <stdio.h>
#include <string.h>

int main() {

    char s[1000];

    while (scanf("%s", s) != EOF) {

        int len = strlen(s);
        int found = 1, AB = 0, BA = 0;

        for (int i = 0; i < len; i++) {
            if (s[i] == 'B' && s[i + 1] == 'A') {
                BA = 1;
                s[i] = ' ';
                s[i + 1] = ' ';
                break;
            }
        }

        for (int i = 0; i < len; i++) {
           
<think>好的,我现在需要帮助用户解决如何在Arduino中使用JSON库将字符串存入JSON文档并解析的问题。用户之前已经询问过关于Arduino WebSocket接收字符串的内容,现在转向JSON处理,可能是他们的项目需要处理接收到的JSON数据。 首先,我需要确认用户使用的JSON库。Arduino常用的库是ArduinoJson,所以我会默认使用这个库进行说明。用户可能已经安装了该库,但可能需要确认版本,不同版本的API可能有所不同。假设用户使用的是v6.x版本,因为这个版本比较常见。 接下来,用户的问题分为两部分:将字符串存入JSON文档和解析。解析部分可能涉及从接收的字符串(比如通过WebSocket)转换为JSON对象,然后提取数据。而存储部分可能是指创建JSON文档并添加字符串数据,然后序列化为字符串发送出去。 我需要考虑用户可能的场景。例如,他们可能从WebSocket接收到JSON字符串,需要解析后读取数据,或者需要构造JSON数据发送到服务器。需要覆盖这两种情况。 然后,我需要详细步骤。首先是如何解析传入的JSON字符串。需要包括引入库、创建DynamicJsonDocument、反序列化、检查错误,然后访问数据。这里要注意内存分配,因为Arduino资源有限,必须正确设置文档大小,否则可能导致内存不足或数据截断。 存储字符串到JSON文档的话,需要演示如何创建文档,添加键值对,然后序列化为字符串。同时,需要提醒用户关于内存管理的问题,比如预分配足够的内存,避免内存碎片。 用户可能遇到的常见问题包括内存不足、JSON格式错误、键名错误等。需要给出调试建议,比如使用serializeJsonPretty打印格式化后的JSON,或者检查反序列化的返回值。 此外,需要提供示例代码,让用户能够直接复制和修改。例如,解析传入的JSON和生成发送的JSON。代码中要包含必要的注释,解释每一步的作用,比如反序列化的过程,如何访问嵌套对象,如何处理数组等。 还要注意一些细节,比如在反serializeJson时,确保输入字符串是正确终止的C字符串,否则可能导致解析失败。同时,提醒用户在动态生成JSON时,估算所需内存,避免溢出。 用户可能对内存分配不太熟悉,所以需要给出如何计算所需内存的方法,比如使用ArduinoJson的助手工具或根据JSON结构估算。例如,每个嵌套对象需要一定的内存,字符串长度和数量也会影响内存需求。 最后,总结关键点,强调正确使用库函数、内存管理和错误处理的重要性。确保用户能够避免常见的陷阱,如内存不足、解析失败等。 在组织内容时,结构要清晰,分步骤说明,代码示例要完整,注意事项要突出。这样用户能够逐步跟随指南,完成他们的任务。</think>以下是关于在 Arduino 中使用 JSON 库解析和构建 JSON 数据的详细指南,以 ArduinoJson 库(v6.x)为例: --- ### 一、环境准备 1. **安装库** 通过 Arduino IDE 的库管理器安装 `ArduinoJson` 库(推荐 v6.21.0+) 2. **内存规划** ```cpp // 根据 JSON 结构预估内存(重要!) const size_t DOC_CAPACITY = JSON_OBJECT_SIZE(3) + 128; // 3个键值对+缓冲区 ``` --- ### 二、字符串解析为 JSON #### 基础解析示例 ```cpp #include <ArduinoJson.h> void parseJSON(String jsonStr) { DynamicJsonDocument doc(1024); // 分配内存池 // 反序列化(字符串转JSON) DeserializationError error = deserializeJson(doc, jsonStr); if (error) { // 错误处理 Serial.print("解析失败: "); Serial.println(error.c_str()); return; } // 提取数据 const char* device = doc["device"]; // 字符串类型 int status = doc["status"]; // 数值类型 float voltage = doc["sensors"]["voltage"]; // 嵌套对象 Serial.print(device); Serial.print(" 电压: "); Serial.println(voltage); } ``` #### 处理复杂结构 ```cpp void parseComplexJSON() { String input = R"( { "network": { "ssid": "MyWiFi", "ip": [192,168,1,100] }, "enabled": true } )"; DynamicJsonDocument doc(512); deserializeJson(doc, input); // 获取嵌套对象 JsonObject network = doc["network"]; const char* ssid = network["ssid"]; // 处理数组 JsonArray ipArray = network["ip"]; String ip = ""; for(byte b : ipArray) { ip += String(b) + "."; } ip.remove(ip.length()-1); // 移除末尾点号 } ``` --- ### 三、构建 JSON 字符串 #### 基本构建方法 ```cpp String buildJSON() { DynamicJsonDocument doc(256); // 添加数据 doc["timestamp"] = millis(); doc["sensor_type"] = "DHT22"; doc["temperature"] = 25.6; doc["humidity"] = 48.3; // 序列化为字符串 String output; serializeJson(doc, output); return output; // 返回 {"timestamp":12345,"sensor_type":"DHT22"...} } ``` #### 构建嵌套结构 ```cpp String buildNestedJSON() { DynamicJsonDocument doc(512); // 创建嵌套对象 JsonObject location = doc.createNestedObject("location"); location["lat"] = 39.9042; location["lng"] = 116.4074; // 创建数组 JsonArray readings = doc.createNestedArray("readings"); readings.add(18.7); readings.add(19.3); readings.add(20.1); String output; serializeJson(doc, output); return output; } ``` --- ### 四、关键技巧 #### 1. 内存优化 ```cpp // 精确计算内存需求(使用 ArduinoJson Assistant 工具) const size_t CAPACITY = JSON_OBJECT_SIZE(2) + // 主对象2个键 JSON_OBJECT_SIZE(3) + // 嵌套对象3个键 JSON_ARRAY_SIZE(5) + // 数组5个元素 128; // 字符串缓冲区 DynamicJsonDocument doc(CAPACITY); ``` #### 2. 流式解析(节省内存) ```cpp void streamParse() { WiFiClient client; client.connect("api.example.com", 80); JsonDocument doc; ReadBufferingClient bufferedClient(client, 64); deserializeJson(doc, bufferedClient); // 逐块解析 } ``` #### 3. 复用文档对象 ```cpp DynamicJsonDocument doc(512); // 全局定义 void processData() { doc.clear(); // 清空原有数据 // 重新填充新数据... } ``` --- ### 五、常见问题解决 | 问题现象 | 解决方案 | |-----------------------|----------------------------| | 返回乱码或截断 | 增大 DynamicJsonDocument 容量 | | 解析数字精度丢失 | 使用 `as<float>()` 显式转换 | | 内存不足导致崩溃 | 使用 `shrinkToFit()` 优化内存 | | 无法解析布尔值 | 使用 `doc["key"].as<bool>()` | | 中文字符乱码 | 确保使用 UTF-8 编码 | --- ### 六、调试技巧 ```cpp // 格式化输出调试 serializeJsonPretty(doc, Serial); // 检查数据类型 if(doc["value"].is<int>()) { Serial.println("这是整数类型"); } // 内存监控 Serial.print("内存使用量: "); Serial.println(doc.memoryUsage()); ``` 通过以上方法,您可以在 Arduino 中高效处理 JSON 数据。建议结合 WebSocket 接收数据时,先验证 JSON 格式正确性再进行解析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值