字符串列整数的转换

理解C++中atoi()函数的溢出问题与解决方案

在平时课本中的atoi();都不能查出OVERFLOW的情况,实际上OVERFLOW是这么产生的:

t = 10 * t + (d - '0');

d是读到的字符(‘0’~‘9’),t是最终的数字,如果t溢出,就是

10 * t + (d - '0') > INT_MAX;

那么就会得到

t  > (INT_MAX - (d - '0')) / 10;

所以要想不溢出,就要

t  <= (INT_MAX - (d - '0')) / 10;


看程序吧:

#include<limits.h>
#include<ctype.h>

#define OVERFLOW 1
#define UNDERFLOW -1
#define NO_ERROR 0

int x_atoi(char s[],int *result)
{
	int digit_value;
	int i;
	
	*result = 0;
	for(i = 0;isdigit(s[i]);i++)
		if(*result <= (INT_MAX - (digit_value = s[i] - '0')) / 10)
			*result = 10 * *result + digit_value;
		else 
			return OVERFLOW;
	return NO_ERROR;
}

在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++ 提供了多种方式将字符串转换整数,包括使用标准库函数、手动实现逻辑等。选择合适的方法取决于具体需求,例如是否需要处理错误或支持负数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值