题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
先介绍一下atoi函数:
用来把一个字符串转换成一个整数,例如:输入字符串“123”,输出数字123
思路:
此题最关键是要考虑到很多临界情况:
1、考虑是否是空字符串,空字符串不合法,返回0
2、考虑字符串是否合法,不合法,返回0
3、最大数问题,超过最大值,返回0
4、不合法情况下返回0,要与正常值返回0,作区分
5、只有正负号情况是合法的。
代码:
class Solution { public: int flag=true;//判断是正常返回的零,还是因为非法输入返回的零 int sys=0;//0代表是正数,1代表是负数 int StrToInt(string str) { //语法: const char *c_str(); // c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同. //如果不用此函数只能用下标法,不能用str直接str++,或者str-- const char* digit=str.c_str(); //考虑字符串是否为空,并做标记 int n=str.size(); if(n==0) { flag=false; return 0; } long long num=0; //考虑是否有正负号,并为负号做标记,并考虑只有正负号的输入,返回零(合法输入) if(*digit=='+') digit++; else if(*digit=='-') { sys=1; digit++; } //将字符串转化为数字,并检查中间是否有非法字符(不在0~9之间的字符) while(*digit!='\0') { if(*digit>='0'&&*digit<='9') { int minus=(sys==1)?-1:1;//判断是正值还是负值 num=num*10+minus*(*digit-'0'); //判断大数问题(最大的正整数与最小的负整数) if(num>0x7FFFFFFF||num<(signed int)0x80000000) { num=0; break; } digit++; } else { flag=false; return 0; } } return num; } };