2012-04-10 58 views
0

我的問題是,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; 
} 

任何幫助,不勝感激!

回答

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

,然後只用XOR[0]到處。

以上只是我的無段錯誤重寫你的代碼是實際上試圖做的。

它應該做什麼。 。 。 strcmp()正在比較二進制文本與相同值的格式化版本,所以它不起作用。你的unsigned char XOR;(或可能是一個8位<stdint.h>類型)是正確的。但將其與==作爲標量而不是strcmp()進行比較。

你把它與相比較。 。 。您需要將您的NMEA可打印的十六進制轉換爲適合於==的標量操作數,因此請使用sscanf()或者只是打開十六進制轉換的代碼。


1.十六進制輸入轉換代碼的例子是在許多計算器的答案。

+0

使用十六進制到整數函數結束:http://johnsantic.com/comp/htoi.html並轉換NMEA可打印的十六進制。然後我按照你的建議進行了一次if測試。謝謝! – StianL 2012-04-11 09:34:34

0

看來(從代碼簡單的介紹一下)你期望的正確的校驗和爲0。如果是這樣,那麼就與零進行比較:

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

strcmp期望空字符終止的C字符串。你的XOR變量甚至不是一個數組。這是一個單獨的unsigned char值。 (我有點驚訝,即使編譯時也沒有警告你。)無論如何,比較二進制數據時最好使用memcmp

0

XOR是一個單字節。校驗和是一組無符號字符。如果編譯器讓代碼通過警告(*),我會轉儲它。

(*):是的,我知道這在技術上是「診斷」。

相關問題