工作了一段时间,一直在公司平台上面码代码,有一天同事分享,突然发现自己连基本的知识都快忘记了
字符串转化z整数数组是考验程序员基本功的经典题目
int stringToInt(const char *str)
{
}
先写一个简单的实现
int stringToInt(const char *str)
{
char *p = str;
int nNUM = 0;
while (*p != '\0')
{
nNum = nNUM * 10 + (*p - '0');
p++;
}
return nNUM;
}
主要逻辑应该就是这样,每取一位字符,用字符和'0'比较计算数值,累加到前面的数值*10上面
前面的基础上考虑一下正负数问题
int stringToInt(const char *str)
{
char *p = str;
int nNUM = 0;
bool bFlage = true;
if (*p == '-')
{
bFlage = false;
p++;
}
else if (*p == '+')
{
p++;
}
while (*p != '\0')
{
nNum = nNUM * 10 + (*p - '0');
p++;
}
if (!bFlage)
{
nNUM = 0 - nNUM;
}
return nNUM;
}
除了+-还有其他非法字符,需要容错处理
int stringToInt(const char *str)
{
char *p = str;
int nNUM = 0;
bool bFlage = true;
if (*p == '-')
{
bFlage = false;
p++;
}
else if (*p == '+')
{
p++;
}
while (*p != '\0')
{
if ((*P < '0') || (*p > '9'))
{
nNUM = 0;
return nNUM;
}
nNum = nNUM * 10 + (*p - '0');
p++;
}
if (!bFlage)
{
nNUM = 0 - nNUM;
}
return nNUM;
}
上面的代码无法判断0 是成功转换的字符串,还是非法数据之后的返回值,因此定义一个枚举常量,保存每次转换是否成功,可以使用系统枚举值,一般库函数都是自带的,保存对应操作是否成功
enum NumState
{
OK = 1,
ERROR
}
int stringToInt(const char *str)
{
char *p = str;
int nNUM = 0;
bool bFlage = true;
enum NumState oState = OK;
if (*p == '-')
{
bFlage = false;
p++;
}
else if (*p == '+')
{
p++;
}
while (*p != '\0')
{
if ((*P < '0') || (*p > '9'))
{
nNUM = ERROR;
return nNUM;
}
nNum = nNUM * 10 + (*p - '0');
p++;
}
if (!bFlage)
{
nNUM = 0 - nNUM;
}
return nNUM;
}
在考虑一下,除了上面问题应该还有溢出的问题,增加溢出的判断
int stringToInt(const char *str)
{
char *p = str;
int nNUM = 0;
bool bFlage = true;
enum NumState oState = OK;
if (*p == '-')
{
bFlage = false;
p++;
}
else if (*p == '+')
{
p++;
}
while (*p != '\0')
{
if ((*p < '0') || (*p > '9'))
{
oState = ERROR;
nNUM = 0;
break;
}
if ((nNUM * 10)>0
&& (*p - '0')
&& (2147483647 - (nNUM * 10) < (*p - '0')))
{
oState = ERROR;
nNUM = 0;
break;
}
nNUM = nNUM * 10 + (*p - '0');
p++;
}
if (!bFlage)
{
nNUM = 0 - nNUM;
}
return nNUM;
}
测试一下:
#include <stdio.h>
#include <stdbool.h>
enum NumState
{
OK = 1,
ERROR
};
int stringToInt(const char *str)
{
char *p = str;
int nNUM = 0;
bool bFlage = true;
enum NumState oState = OK;
if (*p == '-')
{
bFlage = false;
p++;
}
else if (*p == '+')
{
p++;
}
while (*p != '\0')
{
if ((*p < '0') || (*p > '9'))
{
oState = ERROR;
nNUM = 0;
break;
}
if ((nNUM * 10)>0
&& (*p - '0')>0
&& (2147483647 - (nNUM * 10) < (*p - '0')))
{
oState = ERROR;
nNUM = 0;
break;
}
nNUM = nNUM * 10 + (*p - '0');
p++;
}
if (!bFlage)
{
nNUM = 0 - nNUM;
}
return nNUM;
}
int main()
{
int nNum;
nNum = stringToInt("-2147483647");
printf("%d\n", nNum);
return 0;
}
不要忽视容错机制,很重要