题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入
+2147483647
1a33
输出
2147483647
0
int StrToInt(string str) {
int i = 0;
int lenth = str.size();
int flag = 0;
int num = 0;
int flag1 = 0;//判断正负
while (str[i] == ' ')
i++;
if (str[i] == '-'||str[i]=='+')
flag = 1;
if ((str[i] >= '0' && str[i] <='9')||flag==1)
{
if (str[i] == '-')
flag1 = 1;//负数
if (flag == 1)
i = 1;
while (str[i]>='0' && str[i] <= '9')
{
num = num * 10 + str[i]-'0';
i++;
}
if (i == lenth)
{
if (flag1== 1)
return -num;
else
return num;
}
else
return 0;
}
else
{
return 0;
}
}
我们之前在对字符串转换为整型的时候经常用一个atoi函数将传入的字符串转换成int型,这个题目是在牛客网上遇到的一个问题。其实就是来模仿简单的atoi函数。这里我认为自己写的并不好,包括在变量的定义上和代码的可读性上。自己的代码能力还是需要很大的提高。
这里首先要处理一种情况,就是你传进来的字符串前边是空格需要先跳过这些空格。
while (str[i] == ' ')
i++;
我们是通过下标来操作字符串的跳过前半部分的空格如果没有的话就不进入while循环。
if (str[i] == '-'||str[i]=='+')
flag = 1;
之后我用一个标识符来标识传入的字符串开头是不是正负两个号其中一个。如果是flag就被修改成1。
if ((str[i] >= '0' && str[i] <='9')||flag==1)
这里就判断字符串开头是不是0-9中的一个或者是正负号如果不是这两种情况就直接返回错误值,如果是这两种情况就需要开始将你的字符转换数字。
if (str[i] == '-')
flag1 = 1;//负数
if (flag == 1)
i = 1;
进入条件后要判断第一个是不是负号如果是负号的话也是需要标记的这样在最后返回的时候就需要返回负数。然后还需要判断第一个是不是字符是字符的话转换数字的过程就需要从第二个字母开始。
while (str[i]>='0' && str[i] <= '9')
{
num = num * 10 + str[i]-'0';
i++;
}
通过while循环来转换。但是只有获得的字符是在0-9之间才继续转化。
if (i == lenth)
{
if (flag1== 1)
return -num;
else
return num;
}
else
return 0;
如果跳出循环就需要判断是不是走到了字符串的结尾如果是那就说明结束了,返回当前的num就可以如果不是的话说明获取的值123a32的情况这种在数字之间有字母的状态也是非法制,返回0;
这里获得字符串长度的并没有用strlen是因为题目中传进来的字符串是一个自定义类的变量。