的strcmp()给段错误:从整数警告11和指针
问题描述:
我的问题是,STRCMP()函数提出了以下问题:的strcmp()给段错误:从整数警告11和指针
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;
}
任何帮助,不胜感激!
答
char XOR[2] = { 0, 0 };
,然后只用XOR[0]
到处。
以上只是我的无段错误重写你的代码是实际上试图做的。
它应该做什么。 。 。 strcmp()
正在比较二进制文本与相同值的格式化版本,所以它不起作用。你的unsigned char XOR;
(或可能是一个8位<stdint.h>
类型)是正确的。但将其与==
作为标量而不是strcmp()
进行比较。
你把它与相比较。 。 。您需要将您的NMEA可打印的十六进制转换为适合于==
的标量操作数,因此请使用sscanf()或者只是打开十六进制转换的代码。
1.十六进制输入转换代码的例子是在许多计算器的答案。
答
看来(从代码简单的介绍一下)你期望的正确的校验和为0。如果是这样,那么就与零进行比较:
if (XOR == 0)
printf("OK\n");
答
strcmp
期望空字符终止的C字符串。你的XOR
变量甚至不是一个数组。这是一个单独的unsigned char
值。 (我有点惊讶,即使编译时也没有警告你。)无论如何,比较二进制数据时最好使用memcmp
。
答
XOR是一个单字节。校验和是一组无符号字符。如果编译器让代码通过警告(*),我会转储它。
(*):是的,我知道这在技术上是“诊断”。
使用十六进制到整数函数结束:http://johnsantic.com/comp/htoi.html并转换NMEA可打印的十六进制。然后我按照你的建议进行了一次if测试。谢谢! – StianL 2012-04-11 09:34:34