问题描述:输入一个由数字组成的字符串,把它转换成整数并输出,要求不能使用系统提供的转换函数或方法。
例如:输入字符串"123",输出整数123。
许多编程语言提供了字符串和各种类型的转换的函数或方法,但是我们也要会自己编写相应的转换方法或函数,其他类型的转换与此类似。
这里我以字符串转换为整型为例,进行介绍。
分析:基本思路是从左至右扫描字符串,把之前得到的数字乘以10,再加上当前字符表示的数字。但是在转换的过程中,需要注意几个问题。
1、空字符串输入:输入的是空字符串,对空字符串进行转换,程序可能会崩溃,因此需要先判断字符串是否为空。我们约定,当字符串为空时,返回0.
2、正负符号:字符串可能不仅包含数字,还有可能是以'+'或'-'开头表示的正负整数字符串,因此需要对第一个字符进行特殊处理。
3、非法字符:输入的字符串中可能含有不是数字,也不是"+"或者"-"这样的字符。因此,我们约定,每当碰到这些非法的字符时,停止转换,返回0。
4、整型溢出:输入的数字是以字符串的形式输入,因此输入一个很长的字符串将可能导致溢出。因此要考虑边界问题。 我们约定:
当转化的值大于整型的最大值时,返回整型的最大值;
当转换的值小于整型的最小值时,返回整型的最小值;
上述四个问题中,最难处理的是溢出问题,因此,对于溢出,有两种方法去解决。
方法一:定义一个更大范围的变量,作为转换结果,并将转换结果与整型的最大值和最小值进行比较,判断是否溢出。此种方法比较简单,我不再写程序实现。
方法二:读者可以结合下面的代码理解,在转换某位字符之前,
对于正整数,先比较之前转换的结果(本代码中为strint)和max / 10的大小,即:
若strint > max / 10,那么说明最后一步转换时,strint *10必定大于max,此时直接返回max。
若strint == max / 10 ,那么比较该位数字 c 和 max % 10的大小,如果c > max % 10,直接返回max。
对于负整数,同样先比较之前转换的结果(本代码中为strint)和min / 10的大小,即:
若-1*strint < min / 10,那么说明最后一步转换时,-1*strint *10必定小于min,此时直接返回min。
若-1*strint == min / 10 ,那么比较该位数字 -1*c 和 min % 10的大小,如果 -1*c < min % 10,直接返回min。
由于第二种方法比较麻烦,这里我给出第二种方法的Java程序代码,代码写法都比较通用,读者可以很容易的转换为其他语言实现。
需要注意,Java中整型占4个字节,不同的编程语言可能不太一样,读者需要结合自己的编程语言进行适当的调整。
综上所述:完整的Java代码如下:
1 import java.util.*; 2 class Test { 3 public static int StringToInt(String str){ 4 int n=str.length(); 5 int strint=0; 6 int sign=1; //符号标志 7 if(n==0)return 0; //如果字符串为空,则返回 0 8 9 if(str.charAt(0)=='+') //预先处理第一个字符,因为第一个字符可能带有符号位 10 sign=1; 11 else if(str.charAt(0)=='-') 12 sign=-1; 13 else if(str.charAt(0)>='0'&& str.charAt(0)<='9') 14 strint=str.charAt(0)-'0'; 15 else return strint; 16 17 int max=(int)(Math.pow(2,31)-1); //整数为正数的最大值 ,由于Java中整形占4个字节,不同的语言可能不太一样,读者需要自己调整 18 int min=(int)Math.pow(-2,31); //整数为负数的最小值 19 for(int i=1;i<n;i++) //依次处理后续字符 20 { 21 if(str.charAt(i)<'0' || str.charAt(i)>'9')return 0; //如果后续字符中出现非数字字符,则直接返回 0 22 int c=str.charAt(i)-'0'; 23 if(sign==1 && (strint > max / 10 || (strint == max / 10 && c > max % 10))) //最大值越界处理 24 return max; 25 if(sign==-1 && (-1*strint <min/10 || (-1*strint== min / 10 && -1*c < min % 10))) //最小值越界处理 26 return min; 27 28 strint=strint*10+c; //正常处理字符串每一位 的字符 29 } 30 return sign*strint; //正常返回结果 31 } 32 } 33 34 public class Main { 35 public static void main(String[] args) { 36 String str=new String("-21474836"); //读者可以根据需要进行各种测试,这里不再举例 37 System.out.println("str="+str); 38 System.out.println("转换为整型后为:"+Test.StringToInt(str)); 39 40 } 41 42 }
输出结果为:
str=-21474836
转换为整型后为:-21474836
读者可以自己再举例进行验证。
这个题目给出了将字符串转换为整数的方法和需要注意的几个问题,实际编程中,还会有其他类似的转换问题,比如将字符串转换为浮点型(还要考虑小数点问题),等等。
但是这个题目给了我们一种转换的思路,还有需要注意的问题,总之,针对每个类型,要仔细考虑每个类型的特殊情况。关于其他类型的转换,本文不再祥述,读者可以照着这种思路进行考虑编程即可。