有关于sscanf的问题!

winmenaruto 2012-03-09 05:27:51
int _tmain(int argc, _TCHAR* argv[])
{
char hexstr[HEXSTR_LEN+1] = "1234567890ABCDEF";
unsigned char hex[HEXSTR_LEN/2] = {0x00};
unsigned char tmp = 0;
int i = 0;

printf("sscanf test module init...\n");

printf("hex str: %s\n", hexstr);
printf("hex val: ");
for(i = 0; i < strlen(hexstr)/2; i++)
{
sscanf(hexstr + 2 * i, "%2x", &tmp);
hex[i] = tmp;
printf("%.2x ", hex[i]);
tmp = 0;
}
}

作用是,将1234字符串转成0x12,0x34,这么写,报错,说什么tmp corrupted,一定要这么写才行:
int _tmain(int argc, _TCHAR* argv[])
{
char hexstr[HEXSTR_LEN+1] = "1234567890ABCDEF";
unsigned char hex[HEXSTR_LEN/2] = {0x00};
int tmp = 0;
int i = 0;

printf("sscanf test module init...\n");

printf("hex str: %s\n", hexstr);
printf("hex val: ");
for(i = 0; i < strlen(hexstr)/2; i++)
{
sscanf(hexstr + 2 * i, "%2x", &tmp);
hex[i] = (unsigned char)tmp;
printf("%.2x ", hex[i]);
tmp = 0;
}
}


why ?在我看来,0x12一个字节足够保存了,为什么非得int然后强制unsigned char,谢谢
...全文
267 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-03-13
  • 打赏
  • 举报
回复
听说pc-lint能提醒。没实际用过。
winmenaruto 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 joeblackzqq 的回复:]

引用 3 楼 winmenaruto 的回复:

为什么参数不对编译不提醒呢?


字符串作为一个整体传入的,至于字符串内部是什么,又不会检查,自然不会提醒喽!
[/Quote]
那她完全可以提醒:sscanf(hexstr + 2 * i, "%2x", &tmp);
第三个参数需要int instead of char 。。。现在关键是sscanf的第三个参数
JoeBlackzqq 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 winmenaruto 的回复:]

为什么参数不对编译不提醒呢?
[/Quote]

字符串作为一个整体传入的,至于字符串内部是什么,又不会检查,自然不会提醒喽!
winmenaruto 2012-03-13
  • 打赏
  • 举报
回复
求教。。。。。。
winmenaruto 2012-03-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhao4zhong1 的回复:]

因为"%2x"要求对应int变量。没有对应char变量的"%2xc"

printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
[/Quote]
参数不对为什么不是报错,编译能通过,只是运行完后跳出来tmp stack corrupted,结果都出来了
winmenaruto 2012-03-12
  • 打赏
  • 举报
回复
为什么参数不对编译不提醒呢?
赵4老师 2012-03-09
  • 打赏
  • 举报
回复
因为"%2x"要求对应int变量。没有对应char变量的"%2xc"

printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

64,636

社区成员

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

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