strcmp()给出Segmentation fault:11和整数警告指针

时间:2012-04-10 18:35:08

标签: c segmentation-fault avr strcmp

我的问题是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 个答案:

答案 0 :(得分:2)

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

然后在任何地方使用XOR[0]

以上只是我对实际试图做的代码的无意义重写。

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

您将其与进行比较。 。 。您需要将NMEA可打印十六进制转换为适合==的标量操作数,因此请使用sscanf()或只打开十六进制转换代码。 1


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

答案 1 :(得分:0)

看起来(从简短的代码看)您希望正确的校验和为0.如果是这样,那么只需与零进行比较:

if ( XOR == 0 )
    printf( "OK\n" );

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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