sprintf格式化串少识别一个%d

huangjn213 2014-04-18 04:48:45
如题,有一行语句:

char sql_str[1024] = "\0";
time_t now = time(NULL);
int tmp = 2;
sprintf(sql_str, "update `forbidden_list` set block_time=FROM_UNIXTIME(%d), mender='%s', modified_time=FROM_UNIXTIME(%d) where role_id=%d and mode=1;", to_block, "server", now, tmp);

这句很简单的语句,自己建工程测试时也是正确的,但是在我的项目工程中,role_id会=0,即:
sql_str中where role_id=%d的%d被IDE自动变成0了,如果我这么改:

sprintf(sql_str, "update `forbidden_list` set block_time=FROM_UNIXTIME(%d), mender='%s', modified_time=FROM_UNIXTIME(%d) where role_id=%d and mode=%d;", to_block, "server", now, tmp, 1);

会变成role_id = 0 and mode = 2,即IDE认为role_id后面的%d是0,而mode=%d中的%d会对应后面的tmp值,有人碰到过么
...全文
117 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangjn213 2014-04-18
  • 打赏
  • 举报
回复
确实是2楼说的问题,刚测好了来看帖子,发现2L给的是正确答案
赵4老师 2014-04-18
  • 打赏
  • 举报
回复
time_t to_block,now;
//...
#ifdef _USE_32BIT_TIME_T
 sprintf(sql_str, "update `forbidden_list` set block_time=FROM_UNIXTIME(%d), mender='%s', modified_time=FROM_UNIXTIME(%d) where role_id=%d and mode=1;", to_block, "server", now, tmp);
#else
 sprintf(sql_str, "update `forbidden_list` set block_time=FROM_UNIXTIME(%I64d), mender='%s', modified_time=FROM_UNIXTIME(%I64d) where role_id=%d and mode=1;", to_block, "server", now, tmp);
#endif
赵4老师 2014-04-18
  • 打赏
  • 举报
回复
C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\time.h
     86: #ifndef _TIME_T_DEFINED
     87: #ifdef _USE_32BIT_TIME_T
     88: typedef __time32_t time_t;      /* time value */
     89: #else  /* _USE_32BIT_TIME_T */
     90: typedef __time64_t time_t;      /* time value */
     91: #endif  /* _USE_32BIT_TIME_T */
     92: #define _TIME_T_DEFINED         /* avoid multiple def's of time_t */
     93: #endif  /* _TIME_T_DEFINED */
xiaoyaoxiaonizi 2014-04-18
  • 打赏
  • 举报
回复
你的now不是int类型的是time_t的,应该是long,但输出的时候你用%d做格式符,那他就把long划成两个int输出了,所以你的time输出应该也是错的。用%ld试试。

65,209

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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