c++中string常用用法1
一定要引用的包
#include <cstring>//有时候不能去掉c,如果要用strlen函数的话
获取string字符串的长度
str.size(); //这两者都能求得string的长度
str.length();//记得自己赋初值
获取char型数组的长度
char ch[100];
strlen(ch);//查找到‘\0’停止计数,所以此方法获取char型数组的长度不定
//因为char型数组不会自动在末尾添加‘\0’,除非自己手动在末尾添‘\0’
//但是String会,但不能用来获取String的长度
sizeof(ch);//获得的是所占用的内存空间,此例输出为100
string查找特定字符串
string str,str_first;//记得自己赋初值
if(str.find(str_first)!=string::npos)
{
cout<<“字符串str不包含特定字符串str_first”<<endl;
}
else
{
cout<<“字符串str包含特定字符串str_first”<<endl;
}
string转char[]或char*
方法一:
String str;//记得自己赋初值
char p[40001];
str.copy(p, str.size(), 0);//表示把str的值复制给p数组
//第二个空格表示:复制的长度,一般是把整个字符串复制给p数组
//第三个空格表示:从字符串str的第几个开始复制(和数组下标一样,从0开始,不是1)
方法二:
string str ;//记得自己赋初值
const char* p = str.data();//不能去掉const,也不能直接转成char[]
方法三:
string str;//记得自己赋初值
const char *p = str.c_str();//不能去掉const,也不能直接转成char[]
char[]转string
string str;
char p[100];//记得自己赋初值
str=p;//覆盖掉
str+=p;//在string后面追加
输入一行到char[],忽略空格,遇换行符结束输入
#include <stdio.h>//必须引用
char a[50000];
getchar();//如果前面有过输入,并且按过换行,则必须加,因为缓存区里面第一个就是换行
//getchar是从缓存区里面拿值,char型值
while(gets(a)){//必须是char数组,此时输入遇到换行符停止输入,遇到空格不会停止输入
//执行剩余的操作
}
输入字符串,去除非字母
int k=0,len=100;
char a[len];
for(int i=0;i<len;i++){
if (('A'<=a[i]&&a[i]<='Z')||('a'<=a[i]&&a[i]<='z'))//是字母
{
a[k++]=a[i];//最后得到的k才是a数组的长度,但是数组a的实际长度是i(或者说是len),所以后面用时,要注意这一点;
}
}
char[],string字母转大写,转小写
原生态方法:
char a[100];
if('A'<=a[i]&&a[i]<='Z')
{
a[i]+=32;//转小写,如果只需要转大写,则注释该行
}
if('a'<=a[i]&&a[i]<='z')
{
a[i]-=32;//转大写
}
库提供方法:string转大小写
#include <algorithm> //必须引用
string str="abCd12#$%";
transform(str.begin(), str.end(), str.begin(), ::toupper); //转大写,遇到非字母也没事
transform(str.begin(), str.end(), str.begin(), ::tolower); //转小写
库提供方法:char转大小写
scanf("%s",ch);
int len=strlen(ch);
for(int i=0; i<len; i++)
{
ch[i]=towlower(ch[i]);
}
printf("%s\n",ch);
字符串拼接
string str="";
str+="abc";//要使这一行拼接有效,上面str的定义必须是string str="" , 不能是string str;然后直接去拼接
//错误示范
string str;
str+="abc";
字符串拼接double/int,并去掉小数点后面的数值
double header=1403636631463555584.000000;
//直接转成int 会超过int能表示的最大数值范围
stringstream ss;
ss<<header;
string str="";
str+=ss.str();
cout<<str<<endl;
但是如果小数点后面是非0值,得自己试验才知道
但是这样会采用科学计数法,百度了很多人的说法 都不适合我
最终解决方案:
str+=to_string(header);
//我是只需要小数点前面的数值,也不需要四舍五入
istringstream sin_img(main_name);
vector<string> fields_img; //声明一个字符串向量
string field_img;
while (getline(sin_img, field_img, '.')) //将字符串流sin中的字符读入到field字符串中,以逗号为分隔符
{
fields_img.push_back(field_img); //将刚刚读取的字符串添加到向量fields中
}
main_name=fields_img[0];
这样输出就不会采用科学计数法,而且即便header一开始是采用科学计数法,这样转成的string 也不会是科学计数法,至于精度问题 可能需要关注一下
如果double取值在int的取值范围内 下面的示范也是错的
//错误示范
double header=3.000000;
int header_int=(int)header;
string str="";
str+=header_int;
这样绝对不会输出3的 因为str=""为const char[],加3实际是地址+3
//正确示范
int header_int=3;
string str="";
str+=to_string(header_int);