C语言的字符数组和C++的string类型可以用来储存字符串,但是我们会有将其转化为int,double等基本类型的需求,如字符串"3.14"转为double类型的3.14。
本文章介绍几种方法简便解决这一问题,避免自己写功能的麻烦的同时拓展知识。
目录
int转string
一.to_string()方法
使用C++11的to_string可以返回转换的字符串,double等类型同理
#include<bits/stdc++.h>
int main(){
int a=10;
std::cout<<std::to_string(a)<<std::endl;
return 0;
}
二.sprintf方法
和C语言printf类似,但是输出是第一个参数的字符数组
#include<bits/stdc++.h>
int main(){
int a=10;
char arr[10];
sprintf(arr,"%d",a);
printf("%s",arr);
return 0;
}
三.stringstream
原理与sprintf类似,在字符串流中输入int等数据,通过成员函数str返回字符串结果
#include<bits/stdc++.h>
int main(){
int num = 42;
double floating_num = 3.14;
std::stringstream ss;
ss << "Integer: " << num << ", Floating-point: " << floating_num;
std::cout<<ss.str();
return 0;
}
string转int
一.atoi,atof
C语言函数,将string类型转为int,double返回
#include<bits/stdc++.h>
int main(){
char *str1="3",*str2="3.14";
int num1=atoi(str1);
double num2=atof(str2);
printf("num1: %d\n",num1);
printf("num2: %f\n",num2);
return 0;
}
二.stoi,stod
C++string转为int,double方法,错误则抛出异常,可用来检测是否为数字
异常类型为std::invalid_argument& e和std::out_of_range& e分别为错误数据异常和超出数据范围异常
#include<bits/stdc++.h>
using namespace std;
int main(){
string str1="n";
string str2="3.14";
try{
cout<<stoi(str1)<<endl;
}catch(const invalid_argument& e){
cout<<"error"<<endl;
}
cout<<stod(str2)<<endl;
return 0;
}
三.istringstream
和stringstream同继承basic_stringstream
#include<bits/stdc++.h>
using namespace std;
int main(){
istringstream iss("3.14");
double num=0;
iss>>num;
printf("%f",num);
return 0;
}
拓展:正则表达式
在自己实现string和int等类型的转换时最麻烦的是异常的判断,在上文中我们可以通过stoi,stod捕获异常从而判断数据是否可转换。
在面对字符串的数据格式问题上,有一个工具---正则表达式。它可以帮助我们快速简便判断出字符串是否是我们所需要的规定格式。
以下是示例
#include<bits/stdc++.h>
using namespace std;
int main(){
string str1="100";
string str2="-124";
string str3="3/14";
string str4="+12";
string str5="-8.19";
string str6="543n";
string str7="5p.\n";
string str8="0-9";
string str9="0078";
cout<<boolalpha;//将bool类型以true,false形式打出
cout<<regex_match(str1,regex("[+-]?\\d+"))<<endl;
cout<<regex_match(str2,regex("[+-]?\\d+"))<<endl;
cout<<regex_match(str3,regex("[+-]?\\d+"))<<endl;
cout<<regex_match(str4,regex("[+-]?\\d+"))<<endl;
cout<<regex_match(str5,regex("[+-]?\\d+"))<<endl;
cout<<regex_match(str6,regex("[+-]?\\d+"))<<endl;
cout<<regex_match(str7,regex("[+-]?\\d+"))<<endl;
cout<<regex_match(str8,regex("[+-]?\\d+"))<<endl;
cout<<regex_match(str9,regex("[+-]?\\d+"))<<endl;
return 0;
}
执行效果如下: