C中数据类型的转换

Angelgril 2008-09-04 08:32:55
兄弟姐妹帮个忙,我遇到个问题,想请教大家,先谢谢啦.
下面的程序中我想要把一些不同类型数据连接在一起然后打印出来,但是输出的结果却和实际值有出入,比如int型51输出的结果却是3,应该是强制转换(char *)行不通(红色标出的那几段都是有问题的),不知道怎么解决或是有其它的方法呢?

const std::string& CDBOci::Dump(int logMask, const char * inSqlStatement, const CDBBindVar * aBindVar)
{
int X;
int V;
long tmpNumber;
char numString[20];
float tmpFloat;
std::string logString;

if (logMask & LOG_MASK_DUMP_ERROR_SQL) {
SFW_TRACE(logMask, "<SQL Statement - ERROR>");
//QS_TRACE(LOG_MASK_ERROR,"%d\t%s", SQL_INFO,"<SQL Statement - ERROR> test");
}
else {
SFW_TRACE(logMask, "<SQL Statement>");
}
SFW_TRACE(logMask, inSqlStatement);
if (aBindVar != NULL) {
for (X = 0; X < aBindVar->varNumber; X++) {
if (aBindVar->varAttr[X].isArray == FALSE) { // Not bind array
logString = "";
logString = logString + " " + aBindVar->varAttr[X].name + " := ";
// Print out the vaiables by data type
switch (aBindVar->varAttr[X].type) {
case SQLT_INT: //int型
tmpNumber = *(int*)aBindVar->varAttr[X].placeHolder;
//itoa(tmpNumber, buffer, 10);
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%d", SQL_INFO," SQLT_INT ",(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + [color=#FF0000](char*)aBindVar->varAttr[X].placeHolder;

logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_UIN: // unsigned int 型
tmpNumber = *(unsigned int*)aBindVar->varAttr[X].placeHolder;
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%d", SQL_INFO," SQLT_UIN ",(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_LNG: //long 型
tmpNumber = *(long*)aBindVar->varAttr[X].placeHolder;
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%d", SQL_INFO," SQLT_LNG ",(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_FLT: //float型
tmpFloat += *(float*)aBindVar->varAttr[X].placeHolder;
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%f", SQL_INFO," SQLT_FLT ",(char*)logString.c_str(),tmpFloat);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%f;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpFloat);
break;
case SQLT_CHR:
case SQLT_STR: //string 型
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%s", SQL_INFO," SQLT_STR ",(char*)logString.c_str(),(char*)aBindVar->varAttr[X].placeHolder);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "'%s';";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), (char*)aBindVar->varAttr[X].placeHolder);
break;
}[/color] }
else { // Bind array
//aBindVar->varAttr[X].curTableSize);
//SFW_TRACE(logMask, "Bind variable is array !!! Skip dump data.");

for (V=0; V<aBindVar->varAttr[X].curTableSize; V++) {
logString = "";
sprintf(numString,"%d", V);
logString = logString + " " + aBindVar->varAttr[X].name + " [" + numString + "] := ";
// Print out the vaiables by data type
switch (aBindVar->varAttr[X].type) {
case SQLT_INT:
tmpNumber = *(int*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%d", SQL_INFO,(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_UIN:
tmpNumber = *(unsigned int*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%d", SQL_INFO,(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_LNG:
tmpNumber = *(long*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%d", SQL_INFO,(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_FLT:
tmpFloat += *(float*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%f", SQL_INFO,(char*)logString.c_str(),tmpFloat);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%f;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpFloat);
break;
case SQLT_CHR:
case SQLT_STR:
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s", SQL_INFO,(char*)logString.c_str(),(char*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V)));
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
logString += "'%s';";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), (char*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V)));
break;
}
}
}
}
}

return sSQLMsg;
}
...全文
212 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wfcwscwfc 2008-09-17
  • 打赏
  • 举报
回复
q jpl!o wftc mhk vftc ta !
Angelgril 2008-09-17
  • 打赏
  • 举报
回复
顶!顶!顶!顶!
Angelgril 2008-09-08
  • 打赏
  • 举报
回复
更新:

const std::string& CDBOci:: Dump(int logMask, const char * inSqlStatement, const CDBBindVar * aBindVar)
{
int X;
int V;
long tmpNumber;
char numString[20];
float tmpFloat;
std::string logString;
std::string sSQLMsg;

if (logMask & LOG_MASK_DUMP_ERROR_SQL) {
SFW_TRACE(logMask, " <SQL Statement - ERROR>");
//QS_TRACE(LOG_MASK_ERROR,"%d\t%s", SQL_INFO," <SQL Statement - ERROR> test");
}
else {
SFW_TRACE(logMask, " <SQL Statement>");
}
SFW_TRACE(logMask, inSqlStatement);
if (aBindVar != NULL) {
for (X = 0; X < aBindVar->varNumber; X++) {
if (aBindVar->varAttr[X].isArray == FALSE) { // Not bind array
logString = "";
logString = logString + " " + aBindVar->varAttr[X].name + " := ";
// Print out the vaiables by data type
switch (aBindVar->varAttr[X].type) {
case SQLT_INT: //int型
tmpNumber = *(int*)aBindVar->varAttr[X].placeHolder;
//itoa(tmpNumber, buffer, 10);
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%d", SQL_INFO," SQLT_INT ",(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_UIN: // unsigned int 型
tmpNumber = *(unsigned int*)aBindVar->varAttr[X].placeHolder;
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%d", SQL_INFO," SQLT_UIN ",(char*)logString.c_str(),tmpNumber); //用vfprintf 打印
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_LNG: //long 型
tmpNumber = *(long*)aBindVar->varAttr[X].placeHolder;
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%d", SQL_INFO," SQLT_LNG ",(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_FLT: //float型
tmpFloat += *(float*)aBindVar->varAttr[X].placeHolder;
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%f", SQL_INFO," SQLT_FLT ",(char*)logString.c_str(),tmpFloat);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%f;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpFloat);
break;
case SQLT_CHR:
case SQLT_STR: //string 型
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%s", SQL_INFO," SQLT_STR ",(char*)logString.c_str(),(char*)aBindVar->varAttr[X].placeHolder);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "'%s';";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), (char*)aBindVar->varAttr[X].placeHolder);
break;
} }
else { // Bind array
//aBindVar->varAttr[X].curTableSize);
//SFW_TRACE(logMask, "Bind variable is array !!! Skip dump data.");

for (V=0; V <aBindVar->varAttr[X].curTableSize; V++) {
logString = "";
sprintf(numString,"%d", V);
logString = logString + " " + aBindVar->varAttr[X].name + " [" + numString + "] := ";
// Print out the vaiables by data type
switch (aBindVar->varAttr[X].type) {
case SQLT_INT:
tmpNumber = *(int*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%d", SQL_INFO,(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_UIN:
tmpNumber = *(unsigned int*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%d", SQL_INFO,(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_LNG:
tmpNumber = *(long*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%d", SQL_INFO,(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_FLT:
tmpFloat += *(float*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%f", SQL_INFO,(char*)logString.c_str(),tmpFloat);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%f;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpFloat);
break;
case SQLT_CHR:
case SQLT_STR:
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s", SQL_INFO,(char*)logString.c_str(),(char*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V)));
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
logString += "'%s';";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), (char*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V)));
break;
}
}
}
}
}

QS_TRACE(LOG_MASK_ERROR,"%d\t%s", SQL_INFO,(char*)sSQLMsg.c_str()); //用vfprintf 打印

return sSQLMsg;
}
Angelgril 2008-09-04
  • 打赏
  • 举报
回复
谢谢楼上的,那该用什么方法呢?
_石头_ 2008-09-04
  • 打赏
  • 举报
回复
噢!好象错了!上面只有半个字节!
_石头_ 2008-09-04
  • 打赏
  • 举报
回复
比如int型51输出的结果却是3,
------------------------------------
原因是:
int 类型总共有4个字节,51的16进制为0x33,二进制(地址由低到高)分别是 0011 0011 0000 0000,把一个int量强制转换成char形后,因为sizeof(char)=1,所以只会取最低的一个字节里面的内容,此时最低字节是 0011=3
Angelgril 2008-09-04
  • 打赏
  • 举报
回复
输出结果:

154641: 32781 <SQL Statement - ERROR> test
154641: 32781 SQLT_STR :LotType := C
154641: 32781 SQLT_STR :LotType := D
154641: 32781 SQLT_STR :LotType := Y
154641: 32781 SQLT_STR :LotType := Z
154641: 32781 SQLT_STR :LotType := V
154641: 32781 SQLT_INT :Count := 51
154641: 32781 :LotType := C :LotType := D :LotType := Y :LotType := Z :LotType := V :Count := 3
154641

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧