2013-01-06 43 views
2

我正在使用OpenCV,我需要將Iplimage-> ID轉換爲char [],以便我可以使用TCP發送它,然後將其重新轉換爲服務器上的int。C中的奇怪int輸出

這裏是IplImage結構標頭:

typedef struct _IplImage 
{ 
    int nSize; 
    int ID; //<--- ID of type INT 
    int nChannels; 
    int alphaChannel; 
    int depth; 
    char colorModel[4]; 
    char channelSeq[4]; 
    int dataOrder; 
    int origin; 
    int align; 
    int width; 
    int height; 
    struct _IplROI *roi; 
    struct _IplImage *maskROI; 
    void *imageId; 
    struct _IplTileInfo *tileInfo; 
    int imageSize; 
    char *imageData; 
    int widthStep; 
    int BorderMode[4]; 
    int BorderConst[4]; 
    char *imageDataOrigin; 
} 
IplImage; 

這是我的代碼:

char IDbuffer[10]; 
snprintf(IDbuffer,10,"%e",frame->ID);//where frame is of type IplImage* 
printf("frame->ID= %a\n",IDbuffer); 

,這是我得到的印刷:

幀 - > ID = 0x0.0000000037d0cp -1022

甚至試圖

printf("frame->ID= %a\n",frame->ID); 

給我相同的輸出。

這是一個整數格式嗎?如果是的話我怎麼能將這種格式的char *轉換爲int?

在此先感謝。

+1

如何使用正確的格式說明符?對於'%d'的int。要打印一個字符串,使用'%s'。 – Jens

+0

請在發佈之前閱讀您的手冊頁。 –

回答

4

使用%d格式說明符自frame->ID是一個整數:

snprintf(IDbuffer,10,"%d",frame->ID); 

然後使用%s格式說明打印緩衝區:

printf("frame->ID= %s\n",IDbuffer); 

有關於printf手冊頁的格式說明符的更多信息。

+0

使用printf(「frame-> ID =%s \ n」,IDbuffer);給我一個輸出:0, ,同時使用printf(「frame-> ID =%d \ n」,IDbuffer);給出一個輸出-511415808 什麼是正確的? –

+0

@AhmedKato也許幀ID爲零? – iabdalkader

+1

@AhmedKato嘗試'printf(「frame-> ID =%d \ n」,frame-> ID);請問第一個 – iabdalkader

2

%e格式說明符需要參數類型double,而您傳遞的是int。結果的行爲是未定義的。這裏的所有都是它的。

通過使用%e您承諾snprintf。你保證你會在相應的位置提供一個double參數。稍後,您通過提供int而不是double來打破這一承諾,從而導致無意義的結果。你基本上對snprintf說謊關於frame->ID的類型。

%a也需要一個double參數。爲什麼你堅持使用double格式說明符和int參數?你如何期待這個工作?

要麼提供正確類型的參數(即double),要麼使用正確的格式說明符(對int%d)。無論是這個還是那個。像你一樣混合東西不會達到任何目的。

1

你需要投ID打印之前增加一倍:或者

snprintf(IDbuffer,10,"%e", (double)frame->ID); 

,你可以打印爲整數

snprintf(IDbuffer,10,"%d", frame->ID) 

檢查此的詳細信息,snprintf