c++字符串的相关处理

字符串转字符指针

前几天在做网络通信时,遇到一个小问题,里面有一个要把字符串转化为字符指针的需求。
C语言中的字符指针其实相当于c++中的string,只不过c++把它封装了而已。

char *a="abcd";///自动开辟了存放5个字符的内存空间
string b=a;///把指针变量a的首地址赋值给了b的首地址(因为string是c++的类型,所以该表达式只在c++中可行,c中不可行,C语言中没有string类)

这样做不会出现错误,把指针变量a的首地址赋值给了b的首地址。在c++中,字符串在内存的存储方式就是和字符指针的存储方式一样的。但如果你要复制给一个字符数组就不对了,如

char *a="abcd";///字符指针变量,地址是变量
char b[5];///字符数组,地址是常量
b=a;///错误,常量不能被赋值

因为b在此处是一个常量,表示的是一个地址,常量是不能被赋值的。
但是如果这样复制却是可以的

char b[5]="abcd";

这相当于对字符数组初始化,这是c语言中字符数组初始化的方式。
字符数组与字符串的区别是,字符数组的大小是固定的,超过字符数组的大小则不能初始化,只能初始化比数组小的字符串。而字符串则不受大小限制。
一个变量前加上“*”仅仅代表该变量是一个指针变量,变量值为地址。

在c++字符串类中有一个成员函数c_str(),这个函数可以把字符串转为为字符指针,但是最后转化成的字符指针是const char* 类型的,如果你直接这么赋值会出现错误:
string test_str="abcd";
char* a=new char[256];///定义字符指针时一定要开辟内存空间,否则程序容易崩!
a=test_str.c_str();

这是因为两边的类型不匹配。要把字符串转为字符指针代码如下:

///字符串转为字符指针
char* str_to_c(string& s)
{
	char *result = &s[0];
	for (int i = 1; i < s.length() + 1; i++)
	{
		*(result + i) = s[i];
	}
	return result;
}

总结下指针和数组的区别:
以字符数组为例简单说明下数组与指针之间的区别:
char a[3];
char *b;
const char *c;
string d;
相同点:a,b,c,d都表示的是地址;
不同点:
(1). a[3]只能放三个字符数据,*b则不受大小限制,可以存放许多字符变量;c也不受大小限制,与b的区别是b的值能改变,但c的值不能改变。d也不受大小限制,和b基本相同;
(2). a 是常量,b 是变量,c 是常量,d是变量。常量不能被赋值,变量能被赋值;b 和c 的区别是b 能通过指针变量所指向地址的变化来改变其变量的值,但c不能。

字符串其他处理

字符串其他处理

c++中string转int

string str="12345"; 
int b=atoi(str.c_str());

将int转化为string

int n;
char buffer[4];
sprintf_s(buffer, "%d", n);
string str = buffer;

c++中string转double

string str="123.45"; 
double b=atof(str.c_str());

double转string

double f0=123.456;
char buffer[12];
sprintf_s(buffer, "%f", f0);
string str = buffer;

以下是基于boost库的字符串相关处理:

#include <boost/lexical_cast.hpp>
using namespace boost;
try
{
    int x= lexical_cast<int>("100");///字符串->整型
    long y=lexical_cast<long>("2000");///字符串->长整型
    float pai=lexical_cast<float>("3.14159e5");///字符串->float
    double e=lexical_cast<double>("3.141592654");///字符串->double
    string str=lexical_cast<string>("456");///整型->string
    string str2=lexical_cast<string>("0.456");///浮点型->string
}
catch(bad_lexical_cast& e)
{
    cout<<"error: "<<e.what()<<endl;
}
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页