C中的奇怪int输出

时间:2013-01-06 09:39:46

标签: c printf

我正在使用OpenCV,我需要将Iplimage-> ID转换为char [],以便我可以使用TCP发送它,然后在服务器上将其重新转换为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);

这就是我印刷的内容:

  

frame-&gt; ID = 0x0.0000000037d0cp-1022

甚至尝试

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

给我相同的输出。

这是整数格式吗?如果是,我怎么能将这种格式的char *转换为int ??

提前致谢。

3 个答案:

答案 0 :(得分:4)

使用%d格式说明符,因为frame->ID是一个整数:

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

然后使用%s格式说明符打印缓冲区:

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

有关printf手册页中的格式说明符的更多信息。

答案 1 :(得分:2)

%e格式说明符需要类型为double的参数,而您传递的是int。结果行为未定义。这就是它的全部内容。

使用%e即表示您对snprintf做出承诺。您保证在相应位置提供double参数。之后你通过提供int代替double来破坏这一承诺,这会导致无意义的结果。您基本上对snprintf的类型frame->ID撒谎。

%a还需要double个参数。为什么要坚持使用带有double参数的int格式说明符?你觉得这个怎么样?

提供正确类型的参数(double),或使用正确的格式说明符(%dint)。无论是这个还是那个。像你一样混合起来将无法实现任何目标。

答案 2 :(得分:1)

在打印之前,您需要将ID转换为双倍:

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

或者,您可以将其打印为整数:

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

检查此项以获取有关snprintf

的更多信息