c++ string用法

c++中string的用法总结

1、截取字串函数 string.substr(startPos, length)

函数:string string.substr(startPos, length); 截取子函数, startPos默认值是0,但是实践中发现不设置有问题。

2、查找分隔符 string.rfind(string separetor)

函数:string string.rfind(string separetor); 找到分隔符位置

例子:

string imgName = "001.jpg";

string pureName = imgName.substr(0, imgName.rfind("."));

3、string和char*相互转换

3.1、string to char*

方式1

std::string str = "string";
char* chr = const_cast<char*>(str.c_str())

方式2

string str = "some string" ;
char *cstr = &str[0];

方式3

std::string str = "string";
const char *cstr = str.c_str();

Note that it returns a const char *; you aren’t allowed to change the C-style string returned by c_str(). If you want to process it you’ll have to copy it first:

std::string str = "string";
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
// do stuff
delete [] cstr;

Or in modern C++:

std::vector<char> cstr(str.c_str(), str.c_str() + str.size() + 1);
// use &chars[0] as a char*

3.2、char* to string

方式1:直接赋值:

char c[] = "this is a char array";
const char* t = "const char";
string s = t;
string ss = c;

方式2:

同理const char*string

const char* cc = "this is a const exp";
string s(cc, cc + strlen(cc));

3.3、 char*和const char*

const char* src = "this is a const exp";
char* ch = const_cast<char*>(src);
const char* dst = static_cast<const char*>(ch);
cout << ch << endl;
cout << dst << endl;

参考:string char*互相转换

4、int转string函数 to_string()

前置条件:#include<string>

功能:将数字常量转换为字符串

参数:value

返回值:转换好的字符串

定义于头文件

std::string to_string(int value); //(1) (C++11起) 
std::string to_string(long value); //(2) (C++11起) 
std::string to_string(long long value); //(3) (C++11起) 
std::string to_string(unsigned value); //(4) (C++11起) 
std::string to_string(unsigned long value);// (5) (C++11起) 
std::string to_string(unsigned long long value);// (6) (C++11起) 
std::string to_string(float value);// (7) (C++11起) 
std::string to_string(double value); //(8) (C++11起) 
std::string to_string(long double value);// (9) (C++11起)

例子:

#include <iostream>   // std::cout
#include <string>     // std::string, std::to_string
using namespace std ;
 
int main()
{
	std::string pi = "pi is " + std::to_string(3.1415926);
	std::string perfect = std::to_string(1 + 2 + 4 + 7 + 14) + " thshis a perfect number";
	std::cout << pi << '\n';
	std::cout << perfect << '\n';
	
	system("pause");
 
 
}

 其他方法:

C库函数sprintf()

优点:可以转换各种进制的数。

缺点:需要先分配足够的char数组。

#include <string> // string, sprintf
#include <cstring> // strlen(linux)
using namespace std;
 
int main() {
	int n = 100;
	char ch[10];
	sprintf(ch, "%d", n);
 
	//下面把char*转成string
	string str(ch, ch + strlen(ch));
 
	//printf("%s\n",str.c_str());
 
	return 0;
}

itoa函数(Windows)

非C/C++标准,可移植性不好

// Windows
#include <string> // string, sprintf
//#include <cstdlib>
using namespace std;
 
int main() {
    int n=100;
    char ch[10];
    _itoa(n, ch, 10); //10表示十进制,vs2017使用_itoa,其他环境可能使用itoa
    
    //下面把char*转成string
    string str(ch, ch+strlen(ch));
 
    return 0;
}

 

5、字符替换函数 replace()

/* 用法一: 
 * string& replace (size_t pos, size_t len, const string& str); 
 * 源字符串中从位置 pos 开始长度为 len 的字符串 被字符串 str 代替 
 * 
 * 功能:只替换一次
 */ 

/* 用法二: 
 * string& replace (const_iterator i1, const_iterator i2, const string& str); 
 * 用 str 替换 迭代器起始位置 和 结束位置 之间的字符 
 *
 * 功能:替换一段字符串
 */ 
/* 用法三: 
 * string& replace (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen); 
 * 源串指定位置上的子串(pos开始len长度)被替换为 str 的指定子串(给定起始位置和长度)
 */ 

例子:

string result_name = bclimagename;
result_name.replace(result_name.find_last_of(".")+1, 3, "txt");

参考:C++ STL replace()函数常用用法详解 

6、string和CString相互转换

非必要,一定不要使用CString,虽然在windows MFC下CString非常方便,但是跨平台时就非常不方便了。

CString 头文件#include <afx.h>
 
string 头文件#include <string.h>
 
CString 转char *
 
CString cstr;
 
char *p = (LPSTR)(LPCTSTR)cstr;
 
string 转 CString
CString.format(”%s”, string.c_str());
 
char 转 CString
CString.format(”%s”, char*);
 
char 转 string
string s(char *);
 
string 转 char *
char *p = string.c_str();
 
CString 转 string
string s(CString.GetBuffer());
 
1,string -> CString
CString.format(”%s”, string.c_str());
用c_str()确实比data()要好.
2,char -> string
string s(char *);
只能初始化,在不是初始化的地方最好还是用assign().
3,CString -> string
string s(CString.GetBuffer());
GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
 
《C++标准函数库》中说的
有三个函数可以将字符串的内容转换为字符数组和C―string
1.data(),返回没有”/0“的字符串数组
2,c_str(),返回有”/0“的字符串数组
3,copy()
 
―――――――――――――――――――――
 
CString与int、char*、char[100]之间的转换- -
 
CString与int、char*、char[100]之间的转换- -
 
CString互转int
 
将字符转换为整数,可以使用atoi、_atoi64或atol。
而将数字转换为CString变量,可以使用CString的Format函数。如
CString s;
int i = 64;
s.Format(”%d”, i)
Format函数的功能很强,值得你研究一下。
 
void CStrDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString
ss=”1212.12″;
int temp=atoi(ss);
CString aa;
aa.Format(”%d”,temp);
AfxMessageBox(”var is ” + aa);
}
 
sart.Format(”%s”,buf);
 
CString互转char*
 
///char * TO cstring
CString strtest;
char * charpoint;
charpoint=”give string a value”;
strtest=charpoint;
 
///cstring TO char *
 
CString 转char *
 
CString cstr;
 
char *p = (LPSTR)(LPCTSTR)cstr;
 
string 转 CString
CString.format(”%s”, string.c_str());
 
char 转 CString
CString.format(”%s”, char*);
 
char 转 string
string s(char *);
 
string 转 char *
char *p = string.c_str();
 
CString 转 string
string s(CString.GetBuffer());
 
1,string -> CString
CString.format(”%s”, string.c_str());
用c_str()确实比data()要好.
2,char -> string
string s(char *);
只能初始化,在不是初始化的地方最好还是用assign().
3,CString -> string
string s(CString.GetBuffer());
GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
 
《C++标准函数库》中说的
有三个函数可以将字符串的内容转换为字符数组和C―string
1.data(),返回没有”/0“的字符串数组
2,c_str(),返回有”/0“的字符串数组
3,copy()
 
―――――――――――――――――――――
 
CString与int、char*、char[100]之间的转换- -
 
CString与int、char*、char[100]之间的转换- -
 
CString互转int
 
将字符转换为整数,可以使用atoi、_atoi64或atol。
而将数字转换为CString变量,可以使用CString的Format函数。如
CString s;
int i = 64;
s.Format(”%d”, i)
Format函数的功能很强,值得你研究一下。
 
void CStrDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString
ss=”1212.12″;
int temp=atoi(ss);
CString aa;
aa.Format(”%d”,temp);
AfxMessageBox(”var is ” + aa);
}
 
sart.Format(”%s”,buf);
 
CString互转char*
 
///char * TO cstring
CString strtest;
char * charpoint;
charpoint=”give string a value”;
strtest=charpoint;
 
///cstring TO char *
charpoint=strtest.GetBuffer(strtest.GetLength());
 
标准C里没有string,char *==char []==string
 
可以用CString.Format(”%s”,char *)这个方法来将char *转成CString。要把CString转成char *,用操作符(LPCSTR)CString就可以了。
 
CString转换 char[100]
 
char a[100];
CString str(”aaaaaa”);
strncpy(a,(LPCTSTR)str,sizeof(a));
 
 
charpoint=strtest.GetBuffer(strtest.GetLength());
 
标准C里没有string,char *==char []==string
 
可以用CString.Format(”%s”,char *)这个方法来将char *转成CString。要把CString转成char *,用操作符(LPCSTR)CString就可以了。
 
CString转换 char[100]
 
char a[100];
CString str(”aaaaaa”);
strncpy(a,(LPCTSTR)str,sizeof(a));

参考:CString转char * ,string

 

7、string拼接 str1+str2或str1 += str2

 

 

8、string常用方法例子

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string str1 = "hello";
    string* str2 = new string("hello");
    string str3 = "world";

    //获取字符串长度
    int length = str1.length();
    cout << "调用str.length()函数获取字符串长度:" << length << endl;
    cout << endl;


    //字符串连接
    string str4 = str1 + str3;
    cout << "字符串连接结果:" << str4 << endl;
    cout << endl;


    //字符串比较
    if (str1 < str3)
        cout << "字符串比较:" << "str1<str2" << endl;
    cout << endl;


    //获取字符串的第一个字符
    string::const_iterator it = str1.begin();
    cout << *it << endl;
    cout << endl;


    //获取字符串的最后一个字符
    it = str1.end();//end是指向最后一个字符后面的元素,而且不能输出,所以cout << *it << endl;这样输出会报错
    it--;
    cout << *it << endl;
    cout << endl;


    //倒置串
    reverse(str1.begin(), str1.end());
    cout << "倒置串:" << str1 << endl;
    cout << endl;

    //字符串转字符数组
    //不推荐的用法,但是需要了解
    string a = "abc123";
    const char *b;//这里必须为const char *,不能用char *,不然下一句会报错
    b = a.c_str();
    cout << "a:" << a << endl;
    cout << "b:" << b << endl;
    a = "asd456";
    cout << "a:" << a << endl;
    cout << "b:" << b << endl;
    //推荐用法
    string c = "abc123";
    char *d = new char[20];
    strcpy(d, c.c_str());//因为这里没有直接赋值,所以指针类型可以不用const char *
    cout << "c:" << c << endl;
    cout << "d:" << d << endl;
    c = "asd456";
    cout << "c:" << c << endl;
    cout << "d:" << d << endl;
    cout << endl;


    //查找串
    //find-从指定位置起向后查找,直到串尾
    string st1("babbabab");
    cout << st1.find('a') << endl;//1,默认从位置0(即第1个字符)开始查找
    cout << st1.find('a', 2) << endl;//4   在st1中,从位置2(b,包括位置2)开始,查找a,返回首次匹配的位置
    cout << (st1.find('c', 0) == -1) << endl;//1
    cout << (st1.find('c', 0) == 4294967295) << endl;//1   两句均输出1,原因是计算机中-1和4294967295都表示为32个1(二进制)
    string st2("aabcbcabcbabcc");
    str1 = "abc";
    cout << st2.find(str1, 2) << endl;//6,从st2的位置2(b)开始匹配,返回第一次成功匹配时匹配的串(abc)的首字符在st2中的位置,失败返回-1
    cout << st2.find("abcdefg", 2, 3) << endl;//6   取abcdefg得前3个字符(abc)参与匹配,相当于st2.find("abc", 2)

    //rfind-从指定位置起向前查找,直到串首
    cout << st1.rfind('a', 7) << endl;//6

    //find_first_of-在源串中从位置pos起往后查找,只要在源串中遇到一个字符,该字符与目标串中任意一个字符相同,就停止查找,返回该字符在源串中的位置;若匹配失败,返回-1
    string str6("bcgjhikl");
    string str7("kghlj");
    cout << str6.find_first_of(str7, 0) << endl;//2,从str1的第0个字符b开始找,g与str2中的g匹配,停止查找,返回g在str1中的位置2

    //find_last_of-与find_first_of函数相似,只不过查找顺序是从指定位置向前
    string str("abcdecg");
    cout << str.find_last_of("hjlywkcipn", 6) << endl;//5,从str的位置6(g)开始向前找,g不匹配,再找c,c匹配,停止查找,返回c在str中的位置5

    //find_first_not_of-在源串中从位置pos开始往后查找,只要在源串遇到一个字符,与目标串中的任意字符都不相同,就停止查找,返回该字符在源串中的位置;若遍历完整个源串,都找不到满足条件的字符,则返回-1
    cout << str.find_first_not_of("kiajbvehfgmlc", 0) << endl;//3   从源串str的位置0(a)开始查找,目标串中有a,匹配,..,找d,目标串中没有d(不匹配),停止查找,返回d在str中的位置3

    //find_last_not_of-与find_first_not_of相似,只不过查找顺序是从指定位置向前
    cout << str.find_last_not_of("kiajbvehfgmlc", 6) << endl;//3

    system("pause");
    return 0;

}

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落花逐流水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值