c - 使用 strstr 时出现奇怪的错误

标签 c substring strstr

我目前正在 STM32F0 上实现智能电表的 SML 读取器。 一切正常,但我在使用 string.h

中的 strstr 时遇到问题

目前情况:

我有一个字符数组数据,其中包含通过 USART 传入的所有数据。它包含十六进制数字和有效的文本字符串。

该字符串中的某处有以下序列: {0x01,0x01,0x62,0x1b,0x52,0x00,0x55}

我想使用 strstr 查找该子字符串在数据字符串中的位置。

它与此示例字符串配合得很好,该字符串始终位于数据字符串的最开头:{0x1b,0x1b,0x1b,0x1b,0x01,0x01,0x01,0x01,0x76,0x05}

但是如果我使用其他子字符串,它就不起作用。

这是我的代码:

const char needle[] = {0x01,0x01,0x62,0x1b,0x52,0x00,0x55};
    if((needle_ptr = strstr(Data,needle)) == NULL){
        //No Active Power String detected
        flags &= ~NewPowervalue;    //Reset NewPowervalue flag
    }else{

        Powervalue = (needle_ptr[14]<<24) + (needle_ptr[15]<<16) + (needle_ptr[16]<<8) + (needle_ptr[17])/10000;
        //Extract and calculate Powervalue
        flags |= NewPowervalue;     //Set NewPowervalue flag
        Poweroutlets(&Powervalue);
        GPIOC->ODR ^= BLED;
    }

有人知道我做错了什么吗?

最佳答案

当然不行,因为0x00是asciiz终止符,而strstr()比较的是asciiz终止的字符串,所以在0x00处停止比较。

您展示的另一个示例字符串有效,因为它不包含任何 0x00。

因此,归根结底,您不想比较字符串(因为字符串是在 C 中定义的),而是比较内存区域。

因此,您要么必须使用 memmem() 函数(如果您的运行时库有),要么编写自己的函数,这应该不难。 (甚至找到 memmem() 的某些实现的源代码也不难。)

关于c - 使用 strstr 时出现奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45551595/

相关文章:

c - 如何检查一个数组中的特定字符串是否在另一个数组中

java - 如何从大字符串中逐行读取?

android - Sqlite:遍历字符串字段的子字符串

c - 在 C 中使用 strstr 在主字符串中搜索多个字符串

c - strstr() 在 gcc 和 VS 中的实现是否具有线性复杂度?

c - 树排序不排序我的数组

c - 如何修复命令行参数的输出以打印出正确的整数?

c++ - 从 C++ 到 C:替代 std::map?

string - 计算给定字符串的所有可能子串

c - 找出数字 5 在 0 - 4322 内出现了多少次