各有优劣,下面逐一分析。

为了方便,将std::stringstream的方法封装成一个模板函数,如下:

template<typename out_type, typename in_value>
out_type convert(const in_value & t){
	std::stringstream stream;
	stream << t;
	out_type result;
	stream >> result;
	return result;

测试代码如下:

int _tmain(int argc, _TCHAR* argv[])
	auto funPrint = [](const std::string& str){
		std::cout << "-------------------------------------------" << std::endl;
		std::cout << "原始字符串:" << str << std::endl;
		std::cout << "aotf:" << atof(str.c_str()) << std::endl;
		std::cout << "convert:" << convert<double>(str) << std::endl;
		std::cout << "std::stod:" << std::stod(str) << std::endl;
	std::string strValue("12.4ds52");
	funPrint(strValue);
	system("pause");
	return 0;

这里为了后面的测试,将打印功能封装成了一个lambda表达式,执行结果如下:

三种方法,似乎没有区别,都是遇到第一个非合法字符就停止转换。继续,将主函数修改如下:

int _tmain(int argc, _TCHAR* argv[])
	auto funPrint = [](const std::string& str){
		std::cout << "-------------------------------------------" << std::endl;
		std::cout << "原始字符串:" << str << std::endl;
		std::cout << "aotf:" << atof(str.c_str()) << std::endl;
		std::cout << "convert:" << convert<double>(str) << std::endl;
		std::cout << "std::stod:" << std::stod(str) << std::endl;
	std::string strValue("12.4ds52");
	funPrint(strValue);
	strValue = ("a23.4ds52");
	funPrint(strValue);
	system("pause");
	return 0;

与上面相比,多了一次给strValue重新赋值,新的值第一个字符就是非数字,执行结果如下:

很不幸,程序崩溃!!!

从执行结果可以看出来,崩溃的乃是std::stod(str)这一句;另外,利用std::stringstream转换得到的数字为一个未初始化的双精度浮点数;似乎只有atof执行得比较靠谱。

std::stod系列函数(std::stoi、std::stof等),是可以避免让其崩溃的。当给定的字符串完全不能转换成数字,就会抛出一个std::invalid_argument的异常。据此,不但能避免崩溃,一定程度上还能判断字符串的合法性。修改代码如下:

int _tmain(int argc, _TCHAR* argv[])
	auto funPrint = [](const std::string& str){
		std::cout << "-------------------------------------------" << std::endl;
		std::cout << "原始字符串:" << str << std::endl;
		std::cout << "aotf:" << atof(str.c_str()) << std::endl;
		std::cout << "convert:" << convert<double>(str) << std::endl;
			std::cout << "std::stod:" << std::stod(str) << std::endl;
		catch (std::invalid_argument&)
			std::cout << "非法字符串!" << std::endl;
	std::string strValue("12.4ds52");
	funPrint(strValue);
	strValue = ("a23.4ds52");
	funPrint(strValue);
	strValue = ("-.23.124.512");
	funPrint(strValue);
	strValue = ("--1.124");
	funPrint(strValue);
	system("pause");
	return 0;

执行结果如下:

可以看到,四个字符串严格来说,都是非法的,但是只有第二个和第四个抛出了异常。

所以在实际项目中,需要根据具体情况,进行一些异常处理和判断,再选择合适的方式进行转换。

数字转换成字符串

与字符串转成数字差不多,也有三种方式:

1、sprintf_s函数(需要加上头文件 #include "stdio.h");

2、利用std::stringstream流;

3、std::to_string函数(宽字符可用std::to_wstring);

利用std::stringstream流,就是上面封装的convert函数。

sprintf_s函数为sprintf函数的安全版本,需要指定缓冲区大小。

示例代码如下:

int _tmain(int argc, _TCHAR* argv[])
    auto funPrint_dTos = [](double dValue){
        std::cout << "-------------------------------------------" << std::endl;
        std::cout << "原始数字:" << dValue << std::endl;
        char arr[216];
        sprintf_s(arr, 216, "%f", dValue);
        std::cout << "sprintf_s:" << arr << std::endl;
        std::cout << "convert:" << convert<std::string>(dValue) << std::endl;
        std::cout << "std::to_string:" << std::to_string(dValue) << std::endl;
    funPrint_dTos(12.563);
    system("pause");
    return 0;

执行结果如下:

可以看到,sprintf_s和std::to_string都会保留精度,不够的会在小数末尾加上0。当然,sprintf_s可以指定保留的小数位数,将上述代码中的 sprintf_s(arr, 216, "%f", dValue)改为sprintf_s(arr, 216, "%.2f", dValue),执行结果如下:

至于std::to_string,似乎没有指定保留小数位数的办法,只能根据需求自己封装一个函数。

std::stringstream可以自动精确,去除末尾的0。

同样,也需要根据需求选择转换方式。

例如:这个判断基偶性就是为了防止越界所以将数组转换为数组传入,再将最后一位字母转换位数字判断其基偶性 #include<iostream> using namespace std; int main() { int n; cin >> n; string s; while (n--) { cin >> s; int len = s.length(
一:将字符串转化成数字 1.使用字符串stringstream来做类型转化。stingstream能将任何类型轻松转变为字符串类型,也能将字符串类型转变为数字类型 2.使用stoi()或atoi()进行字符串转换 二:将数字转化字符串 1.数字转化为字符串:加 ‘0’ ,然后逆序。 2.数字字符串 sprintf(str, “%d”, num); 三:将数字转化成字符 1.int转char 类型 和数字字符转数字相反 我们可以加上 ‘0’的ASCII 就可以变为char类型 四:将字符转化成数字
如果是stod报错,添加头文件之外,还会报错的请把stod换成atof 原因分析,在不同编译器中,stdlib.h头文件的内容是不一样,关键你要Ctrl+左键,进去看下你的函数名到底是什么。 以下是vs和dev的两个头文件对比。
文章目录使用字符串流对象进行数字转换数字转换字符串数字符串转换数字函数(stoX)toi()和stoi()函数的用法和区别 以字符串形式存储的数字和以数字形式存储的数字之间是有区别的。 例如,字符串 “2679” 就不是一个数字:它是由 2、6、7、9 这 4 个字符的 ASCII 码组成的序列。由于字符串 “2679” 不是一个数字,所以编译器将不允许对它进行加法、乘法和除法之类的数学运算。以数字表示的字符串必须首先转换为数字形式,然后才能与算术运算符一起使用。 同样地,数字形式的程序值,例如 int、
将16进制字符串转换为数字可以通过将每个字符转换为对应的数字然后进行计算得出。在16进制中,数字0-9对应的字符是0-9,而A-F对应的字符是10-15。 例如,字符串"3F"可以转换为数字63,因为3表示3,F表示15,然后根据位权计算,3乘以16的1次方加上F乘以16的0次方等于63。 在Python中,可以使用int()函数将16进制字符串转换为整数,例如int("3F", 16)可以得到数字63。 如果要将一个字符串中的所有16进制数字都转换为对应的数字,可以使用正则表达式来匹配所有的16进制字符串并使用int()函数进行转换,例如: import re s = "hello 0x3F world 0x2A" hex_regex = "0x[0-9A-Fa-f]+" matches = re.findall(hex_regex, s) for match in matches: decimal = int(match, 16) print("{} -> {}".format(match, decimal)) 0x3F -> 63 0x2A -> 42