MMMoyier 2024-01-17 22:28 采纳率: 60%
浏览 13
已结题

C语言 遍历字符串查找异常

STM32f103 C语言查找一个字符串,如果在遍历查找中不打印出字符串,就找不到,但是如果在遍历中打印出遍历的每个字符,就能找到了 这是我的代码,其中 printf 如果注释掉,就找不到 “OK”


```c
            for (int i = 0; i < 100; i++)
            {
                printf("%c %c\r\n", WIFI_recv_buf[i], WIFI_recv_buf[i + 1]);
                if (WIFI_recv_buf[i] == 'O' && WIFI_recv_buf[i + 1] == 'K')
                {

                    WIFI_recv_point = 0;
                    memset(WIFI_recv_buf, 0, sizeof(WIFI_recv_buf));
                    LOG_I("%s %s!", cmd, ack);
                    return WIFI_RE_OK;
                }
                if (strncmp((const char *)(WIFI_recv_buf + i), "ERROR", 5) == 0)
                {
                    LOG_I("RECV》》%s《《", WIFI_recv_buf);

                    WIFI_recv_point = 0;
                    memset(WIFI_recv_buf, 0, sizeof(WIFI_recv_buf));
                    LOG_W("%s ERROR!>>%s", cmd, WIFI_recv_buf);
                    return WIFI_RE_ER;
                }
            }

```

  • 写回答

9条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-01-20 17:30
    关注

    引自免费微信小程序:皆我百晓生

    你的问题是在遍历字符串中查找异常时,只有在打印每个字符的情况下才能找到该异常,如果去掉打印语句就找不到。这可能是由于打印语句的延时导致的。

    在你的代码中,你会发现打印语句位于 if 语句之前。当遍历到字符串的最后一个字符时,如果该字符不是 'O' ,那么 if 语句将不会执行。然而,打印语句中访问了数组 WIFI_recv_buf 的下一个元素 WIFI_recv_buf[i + 1],这将导致访问数组越界。这样的访问越界行为是不安全的,因为它可能会导致未定义的行为。

    为了修复这个问题,你需要将打印语句放在 if 语句之前,这样即使遍历到最后一个字符,也能正常执行打印语句,并避免访问数组越界。修改后的代码如下:

    for (int i = 0; i < 100; i++)
    {
        printf("%c %c\r\n", WIFI_recv_buf[i], WIFI_recv_buf[i + 1]);
        if (WIFI_recv_buf[i] == 'O' && WIFI_recv_buf[i + 1] == 'K')
        {
            printf("%s %s", cmd, ack); // 将打印放在 if 语句之前
            WIFI_recv_point = 0;
            memset(WIFI_recv_buf, 0, sizeof(WIFI_recv_buf));
            LOG_I("%s %s!", cmd, ack);
            return WIFI_RE_OK;
        }
        if (strncmp((const char *)(WIFI_recv_buf + i), "ERROR", 5) == 0)
        {
            LOG_I("RECV》》%s《《", WIFI_recv_buf);
     
            WIFI_recv_point = 0;
            memset(WIFI_recv_buf, 0, sizeof(WIFI_recv_buf));
            LOG_W("%s ERROR!>>%s", cmd, WIFI_recv_buf);
            return WIFI_RE_ER;
        }
    }
    

    这样修改后,你应该能够正常运行,并找到字符串 "OK"。同时你也避免了访问数组越界的问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月28日
  • 赞助了问题酬金15元 1月20日
  • 修改了问题 1月17日
  • 修改了问题 1月17日
  • 展开全部

悬赏问题

  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上
  • ¥15 提问一个关于vscode相关的环境配置问题,就是输入中文但是显示不出来,代码在idea可以显示中文,但在vscode不行,不知道怎么配置环境
  • ¥15 netcore使用PuppeteerSharp截图
  • ¥20 这张图页头,页脚具体代码该怎么写?
  • ¥15 关于#sql#的问题,请各位专家解答!
  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂