[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 ......
函数是程序的执行模块,是整个项目的细胞,如何组织好每一个函数的结构,如何提高程序的可读性和运行效率,是程序员们不断品味的主体。有时函数的设计能直接体现出程序员对C/C++的理解和感悟。
C/C++的函数类型不对外乎以下几种,有些描述可能不太贴切:
......
在网上找到的一个程序
[c]
#include <stdio.h>
#include <sys/types.h>
#include <regex.h>
/* 取子串的函数 */
static char* substr(const char*str,unsigned start, unsigned end)
{
unsigned n = end - start;
static char stbuf[256]; ......
—★—培训周期:共950学时 5个月
—★—培训附赠:保证学员人手一机和一套ARM9开发板
—★—培训内容:在项目经理的带领下,通过完成局网的麻将游戏、My ICQ(网络聊天)和发电机在线监控系统,BT下载软件,掌握基于Linux和Windows平台下的C/C++企业级应用的开发技能,掌握大型软件项 ......