【问题标题】:How to compare an array of char with a string如何将char数组与字符串进行比较
【发布时间】:2012-06-04 02:42:53
【问题描述】:

我的程序是从 Zigbee 接收数据并对其进行过滤以获得我想要的。

unsigned char idata buff[100];            //To read data from rawrxd[] and process data
unsigned char count=0;                    //To store counter for rawrxd[]
unsigned char buff_count=0;               //store counter for buff[], read counter for rawrxd[]
if(buff_count!=count)                   //checking Is there any unread data?
    {
        if(buff_count==100)                 //go back to start position of array
        buff_count=0;

        buff[buff_count] = rawrxd[buff_count];  //read the data

        if(strcmp(buff, "UCAST:000D6F0000A9BBD8,06=!221~@") ==0)
        {
        ES0=0;
        Serial_txString("AT+UCAST:000D6F0000A9BBD8=!222~@");
        tx(0x0D);
        tx(0x0A);
        ES0=1;
        }

        if(strcmp(buff, "UCAST:000D6F0000A9BBD8,06=!221#@") ==0)
        {
        ES0=0;
        Serial_txString("AT+UCAST:000D6F0000A9BBD8=!222#@");  
        tx(0x0D);
        tx(0x0A);
        ES0=1;
        }

        buff_count++;                           //increase the read_count
    }

缓冲区应该是这样接收UCAST,然后将其与字符串进行比较,如果相同,则返回0。 但是,它只比较一次,然后我收到下一个 UCAST,它根本不比较。

此外,第一次比较必须相同才能正常工作。如果收到错误的字符,然后收到正确的字符,它将无法正常工作。由此看来,是指针问题吗?因为我的缓冲区是一个字符数组,我试图将它与一个字符串进行比较。

【问题讨论】:

    标签: c arrays string filter compare


    【解决方案1】:

    问题是buff[] 在进行字符串比较之前没有 NUL 字符。所以strcmp() 没有感觉到接收到的字符串的结尾你认为它应该(而不是看到之前留在数组中的任何内容),因此它永远不会匹配。

         buff [buff_count] = rawrxd[buff_count];  //read the data
         buff [++buff_count] =  '\000';       /*  you need to add this */
    

    有了这个补充,strcmp()s 有机会工作,如果一切都好的话。

    另外,我很确定您可以整理和优化代码序列

        Serial_txString("AT+UCAST:000D6F0000A9BBD8=!222~@");
        tx(0x0D);
        tx(0x0A);
    

    进入

        Serial_txString("AT+UCAST:000D6F0000A9BBD8=!222~@\x0d\x0a");
    

    【讨论】:

    • 我试过把 buff [++buff_count] = '\000';但它重复了很多时间,意味着继续打印。还有,是在读取数据后放的吗?如果是,它根本不起作用。
    • @JiaYuan:对不起。我忘了提到还要删除循环底部增加 buff_count 的语句。
    【解决方案2】:

    通过分配你拥有的方式:

    buff[buff_count] = rawrxd[buff_count];
    

    您只是将 rawrxd 缓冲区的第一个元素分配给 buff 变量。是变量赋值,不是指针赋值。

    由于两者的缓冲区大小相同,因此两个基指针相等,如下所示:

    buff = rawrxd;
    

    然后执行 strcmp(),或者更好的是,使用 strncmp(),因为字节(元素)的数量是固定的。

    希望对你有帮助。

    干杯!

    【讨论】:

    • 另外,你可以直接使用 rawrxd。
    • 你不能分配给buff,因为它是一个数组而不是一个指针。按照 Anshul 的建议直接使用rawrxd,或者使用strncpymemcpy 复制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    相关资源
    最近更新 更多