0

我的问题是 strcmp() 函数会产生以下问题:

main.c:35: warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast

在编译和运行程序时执行以下操作:

Segmentation fault: 11

我知道错误是什么意思,我只是不知道有什么其他方法可以做到……考虑过使用 itoa() 或 sprintf(),但我需要十六进制的校验和,所以看不到如何完成那。

代码如下:

#include "checksum.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char nmea[] ="$GPRMC,131637.000,A,5820.0658,N,00834.5652,E,0.00,,090911,,,A*7E";
    unsigned char checksum[] = "00";
    char data[82];
    int length = strlen(nmea);
    int k = 0;
    int i;
    unsigned char XOR;

    checksum[0] = nmea[(length-2)];
    checksum[1] = nmea[(length-1)];

    for(i=1;i < (length-3);i++){
        data[(i-1)] = nmea[i];
    }
    int dataLength = strlen(data);

    for (XOR = 0, i = 0; i < dataLength; i++)   //XORer for å finne checksum
        XOR ^= (unsigned char)data[i];

    printf("*******************************************************\n");
    printf("Calculating checksum...\n");

    printf("Read checksum: %s\n",checksum);
    printf("Read data: %s\n",data);
    printf("Calculated checksum: %X \n",XOR);

    if(strcmp(XOR,checksum) == 0){          //sammenligner checksumer.
        printf("Checksum: OK!\n");
        //return 1;
    }
    else{
        printf("Checksum: Mismatch!\n");
        //return 0;
    }

    printf("*******************************************************\n");
    //nmeachecksum(buf);
    return 0;
}

任何帮助是极大的赞赏!

4

4 回答 4

2
char XOR[2] = { 0, 0 };

然后XOR[0]随处使用。

以上只是我对您的代码实际尝试执行的操作的无段错误重写。

它应该做什么。. . 这strcmp()是将二进制文本与相同值的格式化版本进行比较,因此它不起作用。您的unsigned char XOR;(或者可能是 8 位<stdint.h>类型)是正确的。但是将此与==作为标量而不是与进行比较strcmp()

你把它比作什么。. . 您需要将您的 NMEA 可打印十六进制转换为适合==使用 sscanf() 的标量操作数,或者只打开十六进制转换代码。1


1.许多stackoverflow答案中都有十六进制输入转换代码示例。

于 2012-04-10T18:40:02.353 回答
0

看来(通过简要查看代码)您期望正确的校验和为 0。如果是这样,那么只需与零进行比较:

if ( XOR == 0 )
    printf( "OK\n" );
于 2012-04-10T18:37:49.810 回答
0

strcmp需要一个空终止的 C 字符串。你的XOR变量甚至不是一个数组。这是一个单一的unsigned char价值。(我有点惊讶这甚至在没有警告你的情况下编译。)无论如何,memcmp比较二进制数据时最好使用它。

于 2012-04-10T18:40:31.883 回答
0

XOR 是单个字节。校验和是一个无符号字符数组。如果编译器通过警告 (*) 让代码通过,我会转储它。

(*):是的,我知道技术上这是一个“诊断”。

于 2012-04-10T18:40:52.847 回答