新手也能上手!盘点2026年当红之选的的降AIGC平台
2026/5/31 16:23:55
// 1. std::to_string() - 最常用std::stringto_string(intvalue);std::stringto_string(longvalue);std::stringto_string(longlongvalue);std::stringto_string(unsignedvalue);std::stringto_string(floatvalue);std::stringto_string(doublevalue);// 示例std::string s1=std::to_string(42);// "42"std::string s2=std::to_string(3.14159);// "3.141590"// 带错误处理的转换函数intstd::stoi(conststd::string&str,size_t*pos=0,intbase=10);//2/8/10/16longstd::stol(conststd::string&str,size_t*pos=0,intbase=10);//2/8/10/16longlongstd::stoll(conststd::string&str,size_t*pos=0,intbase=10);//2/8/10/16unsignedlongstd::stoul(conststd::string&str,size_t*pos=0,intbase=10);//2/8/10/16unsignedlonglongstoull(conststd::string&str,size_t*pos=0,intbase=10);//2/8/10/16floatstof(conststring&str,size_t*pos=nullptr);//仅十进制doublestod(conststring&str,size_t*pos=nullptr);//仅十进制// 示例std::string s="123abc";size_t pos;intnum=std::stoi(s,&pos);// num = 123, pos = 3str(必需参数)const std::string&(常量引用)pos(可选参数)size_t*(指向size_t类型的指针)0(即nullptr)*posnullptr,则忽略此信息base(可选参数)int100或2到36base = 0: 自动检测进制(类似C语言的规则)0x或0X开头 → 十六进制(base 16)0开头 → 八进制(base 8)base = 2~36: 使用指定进制#include<iostream>#include<string>std::string str="123abc";size_t pos;intnum=std::stoi(str,&pos);// pos = 3std::cout<<"数值: "<<num<<std::endl;// 123std::cout<<"未转换位置: "<<pos<<std::endl;// 3std::cout<<"剩余字符串: "<<str.substr(pos)<<std::endl;// "abc"std::string str;// 十进制(默认)str="255";intdec=std::stoi(str);// 255intdec2=std::stoi(str,nullptr,10);// 255// 十六进制str="FF";inthex=std::stoi(str,nullptr,16);// 255// 八进制str="377";intoct=std::stoi(str,nullptr,8);// 255// 二进制(base=2)str="11111111";intbin=std::stoi(str,nullptr,2);// 255// 自动检测(base=0)str="0xFF";intauto1=std::stoi(str,nullptr,0);// 255(自动识别十六进制)str="0377";intauto2=std::stoi(str,nullptr,0);// 255(自动识别八进制)str="255";intauto3=std::stoi(str,nullptr,0);// 255(十进制)#include<iostream>#include<string>voidparseNumber(conststd::string&input){size_t pos;try{longlongnum=std::stoll(input,&pos);std::cout<<"输入: \""<<input<<"\""<<std::endl;std::cout<<"转换数值: "<<num<<std::endl;std::cout<<"已转换字符数: "<<pos<<std::endl;if(pos==input.length()){std::cout<<"✓ 整个字符串都被转换"<<std::endl;}else{std::cout<<"✗ 部分转换,剩余: \""<<input.substr(pos)<<"\""<<std::endl;}}catch(conststd::invalid_argument&e){std::cout<<"✗ 无效参数: 无法转换为数字"<<std::endl;}catch(conststd::out_of_range&e){std::cout<<"✗ 数值超出范围"<<std::endl;}std::cout<<std::endl;}intmain(){parseNumber("123");// 完全转换parseNumber("123abc");// 部分转换,剩余"abc"parseNumber(" 456");// 注意:会自动跳过前导空白parseNumber("abc123");// 无效参数(以非数字开头)parseNumber("99999999999999999999");// 超出范围return0;}std::string str=" 123 ";size_t pos;// stoi 会自动跳过前导空白字符(空格、制表符等)intnum=std::stoi(str,&pos);std::cout<<num<<std::endl;// 123std::cout<<pos<<std::endl;// 5 (第一个'3'后面的空格位置)// stoi: 返回 int (通常是32位)std::string large="3000000000";// 30亿try{intsmall=std::stoi(large);// 可能溢出(取决于平台)}catch(conststd::out_of_range&e){std::cout<<"int 太小,无法存储"<<std::endl;}// stoll: 返回 long long (至少64位)longlongbig=std::stoll(large);// 成功,3000000000| 特性 | 说明 |
|---|---|
| 前导空白 | 自动跳过(空格、制表符、换行符等) |
| 正负号 | 支持+和-前缀 |
| 进制前缀 | base=0 时识别0x/0X(十六进制) 和0(八进制) |
| 停止条件 | 遇到非数字字符时停止(根据进制) |
| 异常 | std::invalid_argument:无有效转换std::out_of_range:超出范围 |
// 模式1:只转换,不关心剩余部分intvalue=std::stoi("123abc");// value = 123// 模式2:检查是否完全转换size_t pos;intvalue=std::stoi("123",&pos);if(pos==str.length()){// 完全转换成功}// 模式3:解析带单位的值std::string data="1024MB";size_t pos;intnum=std::stoi(data,&pos);// num = 1024std::string unit=data.substr(pos);// unit = "MB"// 模式4:十六进制解析std::string hexColor="0xFF0000";intred=std::stoi(hexColor,nullptr,0);// 自动识别十六进制pos参数可避免不必要的字符串拷贝std::from_chars(C++17)std::strtol可能更高效#include<sstream>// 任意类型转字符串std::ostringstream oss;oss<<123;std::string s=oss.str();// 字符串转整数std::istringstreamiss("456");intn;iss>>n;// std::format (C++20) - 类似Python的format#include<format>std::string s=std::format("{:d}",42);// "42"std::string s=std::format("{:#x}",255);// "0xff"| 方法 | 性能 | 适用场景 |
|---|---|---|
to_string/stoi | 中等 | 一般用途,代码简洁 |
stringstream | 较慢 | 复杂格式化或多种类型组合 |
sprintf | 较快 | C风格代码,需注意缓冲区安全 |
format(C++20) | 中等 | 需要复杂格式化时 |
#include<iostream>#include<string>#include<charconv>#include<format>intmain(){// 整数转字符串std::string s1=std::to_string(12345);std::cout<<"to_string: "<<s1<<std::endl;// 字符串转整数(带错误处理)try{std::string s2="123abc";intnum=std::stoi(s2);std::cout<<"stoi: "<<num<<std::endl;}catch(conststd::invalid_argument&e){std::cout<<"Invalid argument"<<std::endl;}catch(conststd::out_of_range&e){std::cout<<"Out of range"<<std::endl;}// from_chars (C++17)std::string s3="999";intvalue;autoresult=std::from_chars(s3.data(),s3.data()+s3.size(),value);if(result.ec==std::errc()){std::cout<<"from_chars: "<<value<<std::endl;}// C++20 format#if__cplusplus>201703Lstd::string s4=std::format("Hex: {:#x}",255);std::cout<<s4<<std::endl;// "Hex: 0xff"#endifreturn0;}stoi不会跳过空白字符,但会抛出异常from_chars不会跳过空白,效率最高但要求严格匹配stod/to_string可能产生精度问题推荐:一般场景用std::to_string和std::stoi;性能关键场景用std::from_chars和自定义缓冲区的to_chars。