将字符串转化为整数问题(C++)

字符串到整数转换的C++实现
本文介绍了一个简单的C++程序,模仿了atoi函数的功能,实现了将字符串转化为整数的过程。包括处理正负号、非法字符和空字符串的情况。


1.将字符串转化为整数问题(C++

仿照atoi实现代码:

// 仿照atoi函数实现字符串转化为整形数据问题
//

#include "stdafx.h"

enum MyEnum
{
	eValid = 0,//合法
	unValid    //不合法
};
int mState = eValid;//定义全局变量,输入非法时设置该全局变量;
                    //则通过检查该全局变量就能够判断输入是否合法;

//实现字符串转化为整形数据atoi问题
int StrToInt(char* str)
{
	//变量初始化
	int number = 0;
	mState = unValid;
	//判断字符串是否为空
	if (str != nullptr)
	{
		/********判断字符是否合法*********/
		//首先判断第一位是否为“+”或“-”号
		bool minus = false;//正负标志
		if (*str == '+')
		{
			++str;
		}
		else if (*str == '-')
		{
			++str;
			minus = true;
		}
		//若两者都不是,则不进行++str;
		/*********处理字符转换**********/
		//判断是否为合法字符
		while ((*str >= '0')&&(*str <= '9'))
		{
			number = number * 10 + (*str - '0');
			++str;
		}

		//判断是否为正常循环完毕
		if (*str == '\0')
		{
			//处理数据
			mState = eValid;
			if (minus)
			{
				number = 0 - number;//转换为负数
			}
		}
		else //字符串有错情况
		{
			number = 0;
		}
	}
	return number;
}


int _tmain(int argc, _TCHAR* argv[])
{
	//测试
	printf("%d\n", StrToInt("+23"));
	printf("%d\n", StrToInt("-23"));
	printf("%d\n", StrToInt("23"));
	printf("%d\n", StrToInt("a23"));
	return 0;
}



### 使用 `stringstream` 进行字符串整数转换C++ 中,可以使用 `std::stringstream` 类将字符串转换整数。该类定义在 `<sstream>` 头文件中,提供了类似于输入输出流的操作方式,支持通过 `<<` 和 `>>` 运算符进行数据类型的转换[^3]。 以下是一个完整的示例,展示了如何使用 `stringstream` 将字符串转换整数: ```cpp #include <iostream> #include <sstream> #include <string> int main() { std::string str = "12345"; int num; std::stringstream ss; ss << str; ss >> num; std::cout << "Number: " << num << std::endl; // 输出:Number: 12345 return 0; } ``` 在上述代码中,首先将字符串写入 `stringstream` 对象中,然后通过 `>>` 操作符提取为整数类型。这种方式适用于将字符串转换整数的需求,并且在处理过程中可以检查输入的有效性[^3]。 --- ### 使用 `atoi` 函数进行字符串整数转换 C++ 提供了标准库函数 `atoi`,该函数定义在 `<cstdlib>` 头文件中,用于将字符串转换整数。该方法适用于 C 风格的字符串(即 `char*` 类型)[^3]。 以下是一个使用 `atoi` 函数的示例: ```cpp #include <iostream> #include <cstdlib> int main() { char str[] = "12345"; int num = atoi(str); std::cout << "Number: " << num << std::endl; // 输出:Number: 12345 return 0; } ``` 该方法简单高效,但需要注意的是,如果字符串无法转换整数(例如包含非数字字符),则 `atoi` 会返回 0,这可能导致歧义,因此在需要处理错误的情况下,建议使用其他方法进行验证[^3]。 --- ### 使用 `std::stoi` 函数进行字符串整数转换 C++11 标准引入了 `std::stoi` 函数,该函数定义在 `<string>` 头文件中,可以直接将 `std::string` 转换整数。与 `atoi` 不同,`std::stoi` 支持异常处理,能够更精确地检测转换错误[^3]。 以下是一个使用 `std::stoi` 的示例: ```cpp #include <iostream> #include <string> int main() { std::string str = "12345"; int num = std::stoi(str); std::cout << "Number: " << num << std::endl; // 输出:Number: 12345 return 0; } ``` 如果字符串中包含非数字字符,或者超出整数范围,`std::stoi` 会抛出 `std::invalid_argument` 或 `std::out_of_range` 异常,因此在需要处理错误的情况下,建议使用 `try-catch` 块进行异常捕获[^3]。 --- ### 手动实现字符串整数转换 除了使用标准库提供的函数,还可以手动实现字符串整数转换。该方法通常涉及逐字符解析字符串,并根据字符的 ASCII 值计算对应的数字值。手动实现适用于学习目的或特定的性能优化场景[^4]。 以下是一个手动实现的示例: ```cpp #include <iostream> #include <cstring> void stringToInt(int &result, const char *str) { int len = std::strlen(str); int sum = 0; for (int i = 0; i < len; ++i) { int digit = str[i] - '0'; int power = 1; for (int j = 0; j < len - i - 1; ++j) { power *= 10; } sum += digit * power; } result = sum; } int main() { char str[] = "12345"; int num; stringToInt(num, str); std::cout << "Number: " << num << std::endl; // 输出:Number: 12345 return 0; } ``` 该实现通过遍历字符串中的每个字符,并计算其在整数中的权重(例如个位、十位、百位等),最终将字符串转换整数。此方法虽然效率较低,但有助于理解字符串转换整数的基本原理[^4]。 --- ### 总结 C++ 中将字符串转换整数的方法有多种,包括使用 `stringstream`、`atoi`、`std::stoi` 和手动实现等。不同的方法适用于不同的场景,例如: - `stringstream` 适用于需要与 C++ 标准库流操作兼容的场景; - `atoi` 适用于 C 风格字符串的简单转换; - `std::stoi` 适用于需要异常处理的现代 C++ 代码; - 手动实现适用于学习目的或特定的性能优化场景。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值