题目描述
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入
+2147483647
1a33
输出
2147483647
0
思路:
- 考虑前导零
- 考虑空字符(空字符无需理会)
- 考虑非法字符(数字+首字符符号)
- 考虑溢出(int),范围 -2147483648 ~ 2147483647
- 只有一个符号
#include <iostream>
#include <time.h>
#include <array>
#include <string>
#include <cstring>
using namespace std;
#define INT_MAX 2147483647
#define INT_MIN (-2147483647-1)
#define INPUT " "
/*
* 将一个字符转换为一个整数
* 考虑:
* 1、溢出
* 2、非法输入,非数字,纯空格,只有一个符号
* 3、前导零
*
*/
bool isDigit(char num){ //判断是否为数字
return (num >= '0'&&num<='9');
}
const char* free_zero(const char * num){ //删除前导零
const char *free_result = num;
while (*num == ' ')
num++;
cout << "free zero function num: " << num << endl;
cout << "free zero function fre: " << free_result << endl;
return num;
}
int isOverFlow(bool minus,const char *num){
cout << "isOverFlow: "<< num << endl;
int index = 0;
int result;
long long value = 0;
cout << "isOverFlow value is : " << value << endl;
while (*num!='\0')
{
value = value * 10 + (*num - '0');
index++; num++;
if(minus == false && value>INT_MAX)
return 1;
if(minus == true && -value<INT_MIN){
cout << "value under INI_MIN and return -1 " << endl;
return -1;
}
}
result = value;
cout << "isOverFlow result is : " << result << endl;
if(minus)
return -result;
else
return result;
}
int StrToInt(string input_str){
bool minus = false ;
const char *input_char = input_str.c_str();
cout << "指针位置1: " << input_char << endl;
const char *input_num = free_zero(input_char);//清除前导零
//判断是否只有一个'-'或者只有一个'+'
cout << "sizeof : " << strlen(input_num) << endl;
if(*input_num == '-'&& strlen(input_num) == 1) {
cout << "请输入正确数字" << endl;
return -2;
}
if(*input_num == '+'&& strlen(input_num) == 1){
cout << "请输入正确数字" << endl;
return 2;
}
if(*input_num == '-'){
input_num++;
minus = true;
}else if(*input_num == '+'){
input_num++;
}
cout << "指针位置2: " << input_num << endl;
//检测非法输入
const char *input_result = input_num;
while(*input_num!='\0'){
cout << "指针位置4:" << *input_num << endl;
if(!isDigit(*input_num++)){
cout << "请输入数字! " << endl;
return 1;
}
}
cout << "指针位置3: " << input_result << endl;
//检测溢出
int result = isOverFlow(minus,input_result);
cout << "结果是: " << result << endl;
return result;
}
int main(){
StrToInt(INPUT);
return 0;
}