string/char*/char**/字符串常量间的关系——C++笔记(一)

这篇博客探讨了C++中的字符串类型`string`、字符数组`char a[]`和C风格字符串之间的关系。`string`提供了方便的初始化、赋值和相加操作,并能与C风格字符串相互转换。字符数组在初始化时可以使用字符串字面值,但数组大小固定且不支持拷贝和赋值。C风格字符串以空字符结束,常用C标准库函数如`strlen`计算长度。在函数参数传递中,数组通常传递的是指向首元素的指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、string

string C++的标准库类型(vector也是标准库类型),表示可变长的字符序列。使用时需要在头文件中包含

#include <string>
using std::string

初始化string对象的方式

string对象利用字符串初始化时,会除去末尾的空字符;

```
string s;        //默认初始化,是一个空串
string s2(s1);   //直接初始化,s2是s1的副本
string s3("value");    //直接初始化,s3是"value"的副本,除去末尾的空字符;
string s3(5, 'c');     //直接初始化,结果为“ccccc"
string s3 = "value";   //拷贝初始化,结果同上
```

读写string对象

int main()
{
    string s;
    cin >> s;
    cout << s << endl;
    return 0;
}

读取:会自动忽略开头的空白,从第一个真正字符读起,直到下一处空白;如输入"     Hello    ",输出会是"Hello";

可以使用getline进行读取整行的操作,可以保留输入在字符前后部分的空白字符。

int main()
{
    string line;
    
    while(getline(cin, line))
        cout << line << endl;

    return 0;
}

getline函数以一个输入流和string对象为参数,读取输入内容直到遇到换行符(换行符也被读进来),随后把内容存到string对象中去(不存换行符);

返回一个流参数;

string对象可以赋值、相加

标准库类型力求与内置类型相同;

两个string对象相加

string s1 = "hello", s2 = "world";
string s3 = s1 + s2;
s1 += s2;

字面值与字符串类型相加(必须有一个是string类型)

string s1 = "hello", s2 = "world";
string s3 = s1 + "," + s2 + "\n";

string对象具有下表运算符和迭代器。

与C风格字符串

string专门提供了一个返回C风格字符串的函数

string s = "hello";
const char *c = s.c_str();

二、字符型数组char a[]

关于数组

与vector相似与区别

相似:存放相同对象的容器,这些对象本身没有名字;

区别:数组大小确定,不能向里面随意添加。

其他

数组编译的时候,维度是已知的,必须是一个常量表达式。

数组不允许拷贝和赋值。

unsigned int = 42;
string a[cnt];    //错误,维度须为常量表达式

int a[] = {0, 1, 2};
int a2[] = a;    //错误
a2 = a;       //错误

数组元素被默认初始化。

字符数组的初始化

字符数组有一种额外的初始化方式:使用字符串字面值初始化。此时字符串字面值末尾的‘\0'也会被拷贝到字符数组当中。

char a1[] = {'C', '+', '+'};
char a2[] = "C++";    //{'C', '+', '+', '\0'}

指针和数组

在用到数组名字的地方,编译器会自动将其替换为指向数组首元素的指针。

同时指针也是迭代器。

char a[] = "hello";
char *p = a;
char *p = &a[0];

三、C风格字符串

字符串字面值是c++由c继承而来的C风格字符串。

C风格字符串存放在字符数组中,以空字符‘\0‘结束。

C标准库string函数/C风格字符串函数

关于头文件,参考<> "" .h说明

#include <cstring>    //c语言头文件string.h的C++形式

函数:传入此类函数的指针,必须是以‘\0'作为结束的数组。

strlen计算字符串长度时,不包括末尾的空字符。

strlen(p)    //返回p长度,不包括空字符
strcmp(p1, p2)    //比较字符串
...

参数传递

数组形参

为函数传递一个数组时,实际上传递的是指向数组首元素的指针;

void print(const char*);
void print(const char[]);
void print(const char[10]);

上面三个函数是等价的。

注意:指针可能是字符的指针,也可能是字符数组首元素的指针。

main函数

int main(int argc, char *argv[])
int main(int argc, char **argv)    //两个声明等价

第二个形参argv是一个数组,它的元素是指向C风格字符串的指针。

因为第二个形参是数组,所以上述两个定义等价。

其他

多维数组

多维数组名,转换得来的指针,是指向第一个内层数组的指针;

int a[3][4];
int (*p)[4];    //p指向含有4个整数的数组
p = &a[2];      //p指向a的尾元素

复杂数组

int *ptrs[10];    //ptrs是指向10个正形指针的数组
int &ptrs[10] = /* ? */;    //错误,不存在引用的数组;
int (*Parry)[10] = &arry;   //Parry指向一个函数10个整数的数组
int (&arrRef)[10] = arr;    //arrRef引用一个含有10个整数的数组

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值