实现一个函数stringToInt,实现把字符串转换成整数这个功能

本文介绍了一种不依赖于标准库函数的手动实现字符串到整数的转换方法。该方法考虑了各种边界情况,如正负号处理、非数字字符检测及整数溢出检查等。
package TestProblem;

public class Test49 {
	/**
     * 题目:实现一个函数stringToInt,实现把字符串转换成整数这个功能,
     * 不能使用atoi或者其他类似的库函数。
     *
     * @param num
     * @return
     */
	//特殊字符输入分为:首字符为-+和0-9的数字
	public static int stringToInt(String num){
		if(num==null||num.length()<1){
			throw new NumberFormatException(num);
		}
		//-或者+都必须是从第一个字符算起!
		char first=num.charAt(0);
		if(first=='-'){
			return parseString(num,1,false);
		}else if(first=='+'){
			return parseString(num, 1, true);
		}else if(first<='9'&&first>='0'){
			return parseString(num, 0, true);
			
		}else{
			throw new NumberFormatException(num);
		}
		
	}
	/**
     * 判断字符是否是数字
     *
     * @param c 字符
     * @return true是,false否
     */
	private static boolean IsDigit(char c){
		return c>='0'&&c<='9';
	}
	 /**
     * 对字符串进行解析
     *
     * @param num      数字串
     * @param index    开始解析的索引
     * @param positive 是正数还是负数
     * @return 返回结果
     */
	private static int parseString(String num,int index,boolean positive){
		if(index>=num.length()){
			throw new NumberFormatException(num);
		}
		int result;
		long tmp=0;
		while (index <num.length()&&IsDigit(num.charAt(index))) {
			tmp=tmp*10+num.charAt(index)-'0';
			//保证所求的的值在整数的范围内
			if(tmp>0x8000_0000L){
				throw new NumberFormatException(num);
			}
			index++;
		}
		if(positive){
			//如果数字溢出
			if(tmp>=0x8000_0000L){
				throw new NumberFormatException(num);
			}else{
				result=(int)tmp;
			}
		}else{
			if(tmp==0x8000_0000L){
				result=0x8000_0000;
			}else{
				result=(int) -tmp;
			}
		}
		return result;
		
	}
	public static void main(String[] args) {
		//System.out.println(Integer.parseInt(Integer.MAX_VALUE + ""));
     // System.out.println(Long.MAX_VALUE);
     // System.out.println(stringToInt(""));
    //System.out.println(stringToInt("123"));
     // System.out.println(stringToInt("+123"));
//      System.out.println(stringToInt("-123"));
      System.out.println(stringToInt("1abc"));//含有字母的都是非法字符
//      System.out.println(stringToInt("+2147483647"));
//      System.out.println(stringToInt("-2147483647"));
//      System.out.println(stringToInt("+2147483648"));
//      System.out.println(stringToInt("-2147483648"));
//      System.out.println(stringToInt("+2147483649"));
//      System.out.println(stringToInt("-2147483649"));
//      System.out.println(stringToInt("+"));
//      System.out.println(stringToInt("-"));
	}
}

在不同的编程语言中,实现字符串转换为整数函数有多种方法。 ### Python 实现 Python 实现字符串转换为整数时,函数会丢弃无用的开头空格字符,直到找到第一个非空格字符。若第一个非空字符为正或负号,会将该符号与后续尽可能多的连续数字字符组合成有符号整数;若第一个非空字符是数字,则直接将其与后续连续的数字字符组合成整数字符串有效整数部分之后的多余字符会被忽略 [^1]。 ```python def str_to_int(s): s = s.lstrip() if not s: return 0 sign = -1 if s[0] == '-' else 1 if s[0] in ('-', '+'): s = s[1:] num = 0 for char in s: if char.isdigit(): num = num * 10 + int(char) else: break return sign * num # 测试 s = " -123abc" print(str_to_int(s)) ``` ### C 语言实现 可以手动实现一个字符串转换为整数函数,不调用 C 语言提供的相关函数 [^4]。 ```c #include <stdio.h> #include <string.h> int function(char *p) { if (p == NULL) { printf("data is error\n"); return 0; } long s = 0, t; int i = 0, j, n = strlen(p), k, s1; if (p[0] == '-') i++; for(j = i; j <= n-1; j++) { t = p[j] - '0'; s1 = 10; for(k = j; k < n-1; k++) t *= s1; s += t; } if (p[0] == '-') return s * -1; else return s; } int main() { char *s = "-1234"; int result = function(s); printf("result is %d\n", result); return 0; } ``` ### C++ 实现 C++ 可以使用 `atoi()` 函数字符串转换为整数,该函数会扫描字符串,跳过前面的空白字符,直到遇上数字或正负符号才开始做转换,遇到非数字或字符串结束时结束转换,并返回结果 [^2][^3]。 ```cpp #include <iostream> #include <string> #include <stdlib.h> // 部分编译器需要包含此头文件 using namespace std; int main() { string s = "1234"; int num = atoi(s.c_str()); // 将C++字符串转化为C字符串 cout << num << endl; // 1234 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值