【题 目】输入一个表示整数的字符串,把该字符串转换成整数并输出。例如:输入“123”,输出整数123.
【思 路】当然首先想到的就是C语言库函数atoi,一行代码就完事了,当然我们是想不借助该库函数来实现自己的算法。首先,我们考虑怎么把字符串转换成整数,我们输入“123”,我们可以遍历这个字符串,首先读入1,然后读到2,这时我们想要的是12=1×10+2;然后读入3,我们想要的是123=12×10+3;分析到这里,我们就会发现,我们只需要注意遍历每一个字符,将已经得到的数字×10然后加上该字符,就能得到整数了,用一个循环就可以轻松搞定。
算法的主体框架算是完成了,但是我们还要考虑特殊的输入情况;
(1)如果是负数怎么办?我们可以首先判断第一个字符是不是正负号,是符号的话,最后记得将所得的数字加一个负号就OK了。
(2)考虑非法输入的情况,如果用户输入的字符不是在0-9之间的字符,而是别的字符,我们返回什么,如果返回0,那么如果用户的确输入的是0,我们返回0;怎么区分这两种情况呢?我们可以用一个bool型的全局变量来存放是否是非法输入。如果输入为空呢?
(3)最后我们还要考虑,由于字符串的长度可以很长,那么它对应的整数就可能产生溢出,对于这种情况,我们也要进行处理。
好了,经过这样的考虑,我们就可以写出如下的代码了:
- #include<iostream>
- #include<string>
- #include<limits>
- using namespace std;
- bool validInput = false; //是否合法输入 用来区分是不是非法输入 返回的0
- /************************************************
- /* 将数字字符串转换成对应的整数
- /************************************************/
- int StrToInt(const char* str)
- {
- validInput = false;
- bool IsMinus = false; //是否为负数标志
- const char* digit = str;
- long result = 0;
- if(str != NULL) //非空字符串 否则输出 0
- {
- //判断首字符是不是正负号
- if(*digit == '+')
- {
- digit++;
- }
- else if(*digit == '-')
- {
- IsMinus = true;
- digit++;
- }
- //判断剩下的字符
- while((*digit) != '\0')
- {
- //字符处于0-9之间的有效字符
- if(*digit >= '0' && *digit <= '9') //输入合法
- {
- result = result * 10 + (*digit - '0');
- //溢出,即大于最大的正数,小于最小的负数
- if((result > numeric_limits<int>::max() && !IsMinus) || (-result < numeric_limits<int>::min() && IsMinus))
- {
- result = 0;
- break;
- }
- digit++;
- }
- //其他在0-9之外的非法字符
- else
- {
- result = 0;
- break;
- }
- }
- //遍历到最后一个字符,说明是有效输入;检查正负号
- if(*digit == '\0')
- {
- validInput = true; //合法输入
- if(IsMinus) //为负数
- {
- result = 0 - result;
- }
- }
- }
- return static_cast<int>(result);
- }
- int main()
- {
- cout<<"please enter your string:"<<endl;
- char *mystring = new char[100];
- cin>>mystring;
- cout<<"your string convert to int number is:"<<endl;
- cout<<StrToInt(mystring)<<endl;
- cout<<"the status of your input is:"<<endl;
- cout<<validInput<<endl;
- delete[] mystring;
- return 0;
- }