[C/C++] 把一个整型整数转成字符串
问题描述:写一个函数,接受一个整数(假定用int表示),输出该整数的字符串形式。采用如下函数原型:
void itoa ( int val, char* buf );
这里假定buf足够大以容纳任何int类型数值的字符串。
这个问题,初看好像没有什么难度。如果是0,就直接输出'0';如果是正数,就通过取模(%)和求商(/)运算可以逐位取得该整数的数字,并把它们放到buf中去;如果是个负数,就先转成正的,然后在最后输出时加入负号。按照这个思路,可以写下如下代码:
void itoa_flawed(int val, char* buf)
{
// deal with special case
if(val == 0)
{
buf[0] = '0';
buf[1] = '\0';
return;
}
bool negative = (val < 0);
int abs_val = negative ? -val : val;
unsigned int char_cnt = 0;
while(abs_val > 0)
{
buf[char_cnt] = abs_val % 10 + '0';
char_cnt ++;
abs_val = abs_val / 10;
}
if(negative) buf[char_cnt++] = '-';
//reverse the string
unsigned int i = 0;
while(i < char_cnt / 2)
{
char temp = buf[i];
buf[i] = buf[char_cnt-i-1];
buf[char_cnt-i-1] = temp;
i++;
}
buf[char_cnt] = '\0';
}
一切看起来都没有问题。但是,如果我们这样调用该函数的话,猜猜会输出什么:
char buf[40];
itoa_flawed(1 << 31,buf);
cout<<buf;
我们得到的是"-"。这是为什么呢?大家请注意第11行代码。当我们求一负数的绝对值时,如果还是用原来大小的有符号类型时,可能会产生溢出!我们知道,int类型只能表示-231
~ 231
-1
之间的数值。如果我们对-231
求绝对值并把它存放到int类型的变量中,会发生什么情况?分析到这里,大家都应该清楚了吧!
这个bug是很隐蔽的。我在网上看到的代码基本上都和上面给出的差不多,没有考虑这个可能的溢出问题。修正的办法,就是用更大的类型来存放绝对值。观察到绝对值是非负的,我们可以用一个unsigned int
来表示绝对值,这样就不会有问题了。
这个题目给我的启示是,虽然看起来简单的题目,也可能有很大的陷阱。如果这是一道面试题的话,估计完全做对的不多,可能也包括现场的我在内。
相关文档:
最近经常看到网友们抱怨由于操作不当,使用GHOST恢复系统后分区不见了,机也死了,几年辛辛苦苦收藏的东东也不见了,几乎天天都有人上网求助,高手大侠们整天忙于新产品的开发,不可能有更多时间及时一一解答网友们的所提出的问题,因此我在网上看到了这个软件,现推荐给大家使用.
以下是一个高手的处理这类事故的经过
&nb ......
最近要用到相关技术,先贴在这,有空再翻页。
本文转自:
http://www.codeguru.com/Cpp/I-N/ieprogram/article.php/c4399
http://www.codeguru.com/cpp/i-n/ieprogram/article.php/c4399/JavaScript-Calls-from-C.htm
http://www.codeproject.com/KB/COM/jscalls.aspx
Introduction
Sometimes, when we are usi ......
3.2 高效率测试:四两拔千斤
上一节介绍了一些似是而非的高效率方法,那么,怎样才能真正高效率测试呢?真正的高效率,不能忽略人的智慧这一关键因素。
由于工具不可能自动了解代码的设计功能,只有人才了解,因此,只有人的智慧及时介入,工具才能做正确的事情,才能达到真正的高效率。
&nb ......
—★—培训周期:共950学时 5个月
—★—培训附赠:保证学员人手一机和一套ARM9开发板
—★—培训内容:在项目经理的带领下,通过完成局网的麻将游戏、My ICQ(网络聊天)和发电机在线监控系统,BT下载软件,掌握基于Linux和Windows平台下的C/C++企业级应用的开发技能,掌握大型软件项 ......