最初看这道题时,产生了一个疑问:将所有字符转换为整数后相加还是转换字符串中的数字字符。如果只转换数字字符,什么格式的数字字符合法?因为只给了一句:将一个字符串转换为整数,所以才会有这些疑问,权当思考一下。
在此给出题目的具体描述:
将一个字符串转换为整数,字符串中可能包含其他字符,但仅对字符串开头合法的数字字符进行转换。如: -123abc4,转换结果为-123;要求不能使用字符串转整数的库函数。
解题思路:
首先,写个测试用例:
int main(){
long long result;
string str = "-123456789char";
result = strToInt(str); //转换
if(valid) //全局变量,若输入字符串合法便输出结果
cout << "Result is: " << result ;
else
cout << "Integer string is not valid!";
return 0;
}
Output: -123456789
本题需要考虑的几个方面:
- 输入为空
- 正负号
- 非数字字符
- 溢出问题
函数的开发过程如下:
1.定义需要的变量
//全局变量,标记输入是否合法, 默认不合法
bool valid = false;
long long strToInt(string &str){
//待返回的结果
long long res = 0;
//负号标记
bool minus = false;
//string迭代器
string::iterator iterBeg = str.begin();
}
2.核心代码
考虑到数字可能有正负号,对其判断。若存在正负号,就使迭代器前进一个字符。如果之后的字符不是数字会直接退出,若是数字则使用公式转换为整数。例如扫描到第一个数字字符是2,result = 2,接下来扫描到第二个数字字符3, result就应该等于23,此时result = result*10+3,即 2*10+3 = 23; 扫描到第三个数字字符4, result = result * 10 + 4, 即23 * 10 + 4 = 234;依次类推,直到结尾或者遇到非数字字符便退出循环。
对于计算出的结果应判断是否有溢出,如溢出将结果设为0.
//如果字符串不为空
if(*iterBeg != NULL){
//判断正负号
if(*iterBeg == '+')
++iterBeg;
else if(*iterBeg == '-'){
minus = true;
++iterBeg;
}
while(*iterBeg != NULL){ //循环至字符串末尾或非数字字符会退出
if(*iterBeg >= '0' && *iterBeg <= '9'){
valid = true;
res = res * 10 + *iterBeg - '0'; //计算结果
//溢出处理
if(res > INT_MAX){ //上溢
cout << "Over flow\n";
res = 0;
break; //溢出结果赋值为0,并退出
}
++iterBeg;
}else{ //字符非0-9的数字,即刻退出
break;
}
}
if(minus) //负数转换
res = 0 - res;
if(res < INT_MIN){ //下溢
cout << "Under flow\n";
res = 0;
}
}
return res;
需要注意的地方:
C++中不能给string字符串赋值为NULL。