字符串转换整数

博客介绍实现atoi函数,将字符串转换成整数。函数会丢弃开头空格,首个非空字符为正负号或数字时进行转换,多余字符忽略。若首个非空字符无效、字符串为空或仅含空白字符则不转换,返回0。还给出样例及实现分析。

题目描述:

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

  • 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
  • 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
  • 该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
  • 注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
  • 在任何情况下,若函数不能进行有效的转换时,请返回 0。

样例:

输入: “words and 987”
输出: 0
解释: 第一个非空字符是 ‘w’, 但它不是数字或正、负号。因此无法执行有效的转换。
输入: “4193 with words”
输出: 4193
解释: 转换截止于数字 ‘3’ ,因为它的下一个字符不为数字。
输入:-000020-300000
输出: -20

分析:

  1. 去除字符串首尾的空格字符,第一个字符只能是正负号或者数字;
  2. 出现有效数字后之后出现非数字字符都忽略,直接return非数字字符之前形成的有效数字
  3. 注意超出int范围内的数字要用最大值或者最小值代替
public int myAtoi2(String str) {
		 if(str==null||str.length()==0)
			 return 0;
		 str=str.trim();//去除首尾空格
		 StringBuilder sb=new StringBuilder();
		 boolean isNeg=false;
		 for(char c:str.toCharArray()) {
			 if(sb.length()==0&&(c=='+'||c=='-')) {
				 if(c=='-')
					 isNeg=true;
				 sb.append(c);
			 }else if(c>='0'&&c<='9') {
				 sb.append(c);
			 }else {
				 break;
			 }
		 }
		 if(sb.length()==0||(sb.length()==1&&(sb.charAt(0)=='+'||sb.charAt(0)=='-')))
			 return 0;
		 try {
			 return Integer.parseInt(sb.toString());
	        } catch (NumberFormatException e) {
	            if (isNeg) {
	                return Integer.MIN_VALUE;
	            } else {
	                return Integer.MAX_VALUE;
	            }
	        }
	 }
在C++中,将字符串转换整数可以通过多种方法实现。以下是几种常用的方式: 1. **使用标准库函数 `atoi()`** `atoi()` 是 C 标准库中的一个函数,用于将字符串转换整数。该函数在 `<cstdlib>` 头文件中定义。如果字符串数字开头,则会将其转换整数;若字符串中包含数字字符,则会在第一个数字字符处停止转换。 ```cpp #include <iostream> #include <cstdlib> using namespace std; int main() { const char* str = "12345"; int num = atoi(str); cout << "转换后的整数为:" << num << endl; return 0; } ``` 如果字符串无法转换整数(例如包含数字字符),`atoi()` 会返回 0。需要注意的是,该方法无法处理字符串开头的空格和负号以外的其他字符。 2. **使用 `std::stoi()` 函数** `std::stoi()` 是 C++11 引入的字符串转换函数,定义在 `<string>` 头文件中。相比 `atoi()`,`std::stoi()` 提供了更好的错误处理机制。 ```cpp #include <iostream> #include <string> using namespace std; int main() { string str = "12345"; int num = stoi(str); cout << "转换后的整数为:" << num << endl; return 0; } ``` 该函数支持字符串开头的空格,并能处理负数。如果字符串无法转换,会抛出异常(如 `invalid_argument` 或 `out_of_range`)。 3. **手动实现转换逻辑** 如果希望了解字符串转换整数的具体过程,可以手动实现逻辑。以下代码演示了如何将字符串逐个字符转换整数,并考虑负数的情况[^1]: ```cpp #include <iostream> using namespace std; int customStoi(const char* str) { int num = 0; int sign = 1; int i = 0; if (str[0] == '-') { sign = -1; i++; } while (str[i] != '\0') { if (str[i] >= '0' && str[i] <= '9') { num = num * 10 + (str[i] - '0'); } else { break; // 遇到数字字符停止转换 } i++; } return num * sign; } int main() { const char* str = "-12345"; int num = customStoi(str); cout << "转换后的整数为:" << num << endl; return 0; } ``` 4. **使用 `sscanf()` 函数** `sscanf()` 是 C 标准库中的一个函数,可以从字符串读取格式化输入。它在 `<cstdio>` 头文件中定义。 ```cpp #include <iostream> #include <cstdio> using namespace std; int main() { const char* str = "12345"; int num; sscanf(str, "%d", &num); cout << "转换后的整数为:" << num << endl; return 0; } ``` 该方法适用于字符串中包含格式化数据的情况。 ### 注意事项 - 在使用 `atoi()` 或 `std::stoi()` 时,需要确保字符串内容符合整数格式要求,否则可能导致错误或异常。 - 如果字符串包含前导空格或字符,需要在转换前进行清理或验证。 ### 示例输出 假设输入字符串为 `"12345"`,上述方法的输出结果为: ``` 转换后的整数为:12345 ``` 如果输入字符串为 `"-12345"`,输出结果为: ``` 转换后的整数为:-12345 ``` ### 总结 C++ 提供了多种方式将字符串转换整数,包括使用标准库函数、手动实现逻辑等。选择合适的方法取决于具体需求,例如是否需要处理错误或支持负数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值