c++学习笔记9 —— c风格字符串和多维数组

本文介绍了C++中的C风格字符串,包括strlen、strcmp、strcat和strcpy等函数的用法,并强调了使用string类型的优点。同时,探讨了多维数组的概念,如何初始化、访问以及使用指针操作多维数组,建议尽量使用vector和string以提高安全性。

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

  1. c风格字符串:字符串字面值,书写的字符串存放在数组中,并以’\0’结束;如:
char a[] = {'c','+','+','\0'};//显示添加'\0';维度为4
char b[] = "c++";//自动添加 '0';维度为4
char c[] = {'c','+','+'};//维度为3,没有'\0'

c风格字符串的函数:
1)strlen§ 返回p的长度,不包括’\0’
2)strcmp(p1,p2) 比较p1和p2的相等性,相等返回0,p1>p2返回正值,p1<p2返回负
3)strcat(p1,p2) 将p2拼接在p1后,返回
4)strcpy(p1,p2) 将p2拷贝给p1,返回

使用此类函数必须是以空字符’\0’为结束的*字符*数组。

注1:使用string类型的时候要知道其长度:使用.size()函数
strlen仅用于c风格字符串,char且有空字符。
注2:使用string类型的时候要比较使用,直接比较。s1<s2,比较c风格字符串,使用strcmp()函数。
注3:string对象 的拼接直接使用+号,c风格字符串使用strcar.
注4:string对象的拷贝是直接拷贝,s1 =s2,c风格字符串使用strcpy
值得注意的是:不管是拷贝还是拼接,都有一个数组,而该数组的大小必须能放下所有的元素,不然会产生意想不到的后果
综上:使用string更安全

注:任何出现字符串字面值的地方都可以使用以空字符结束的字符数组来替代。
1)允许使用以空字符为结束的字符数组来初始化string对象,或为string对象赋值。
2)在string对象的+法运算中允许使用以空字符为结束的字符数组作为一个运算对象
3)在string对象的复合赋值运算中允许使用以空字符串结束的字符数组作为右侧的运算对象。

不能利用string对象直接初始化指向字符的指针,如:

string s("hello");

char *str = s;//错误,不能直接使用
const char *str =s.c_str();//正确

.c_str()函数返回的是一个指针,指针的类型是const char*

  1. 可以使用数组初始化vector,反之不行
int a[] = {0,1,2,3};
vector <int> v(begin(a),end(a));
  1. 注:应该尽量使用vector和迭代器,避免使用内置数组和指针,尽量使用string,避免使用c风格字符串。

  2. 多维数组:
    理解:无多维数组,只有数组的数组

int a[3][4];//维度为3的数组,每个数组元素是一个含有4个整数的数组

1)多维的初始化:

int a[3][4] = {{1,2,3,4},{2,3,4,5},{3,4,5,6}};//显示初始化3行4列
int a[3][4] = {1,2,3,4,2,3,4,5,3,4,5,6};//显式初始化3行4列

int a[3][4] = {{0},{4},{8}};//初始化了每行的第一个元素,未初始化的默认为0
int a[3][4] = {1,2,3,4};//初始化第一行的4个元素,其余的默认初始化

2)下标:0为起始行列

int a[3][4];
int b[3][4][5];

a[2][3] = b[2][3][3];//确定的赋值,把b的第3行第4列第4个元素赋给a的第三行第4列

int (&r)[4] = a[1];//把a的第二行元素(含有4个)绑定到r(

3)双层for循环:

for(i=0;i<m;++i)//第一层遍历所有的行
	for(j=0;j<n;j++)//第二层遍历每行下的列元素
	

4)使用范围for
注:使用范围for循环处理多维数组,除了最里层 的循环外,其他的都要使用引用类型:

int a[3][4];

for(auto &r :a)
for( auto c :r)//如果写成for(auto c :a)在输出的就是这12个元素的地址了
cout<<c<endl;

5)指针与多维数组:

int a[3][4];
int (*p) [4] = a;//p指向a的第一行,,所指的是一个维度为4 的数组

int *p[4] ;//p是含有4个整形指针的数组
int *&r)[10]=ptr;//r是一个引用,引用的是一个有10个元素的数组,10个元素的类型是整形指针。

区分:整形指针的数组和指向多维数组的指针。

使用指针输出a[3][4]

int a[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
for (auto p =a;p!=a+3;++p)//注意,写成for(int *p=a;p!=a+3;p++)编译不通过
 for(auto q =*p;q!=*p+4;++q)
 cout<<*q<<"  ";

注:p的类型是指向含有4个整数的数组的指针,q的类型是指向整数的指针

int a[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
for( int (*p)[4] =a;p!=a+3;p++)
 for( int *q =*p;q!=*p+4;q++)
  cout<<*q<<" ";

使用类型别名也可以

int a[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
using int_arr = int[4];//将含有4个元素的数组指针类型命名为int_arr,
for (int_arr*g =a;g!=a+3;g++)
  for( int *j =*g;j!=*g+4;j++)
  cout<<*j<<" "; 

使用范围for循环

int a[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
for (auto &r :a)
 for (auto c:r)
 cout<<c<<" ";

使用for循环:

int a[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
for( int i=0;i<3;i++)
 for(int j=0;j<4;j++)
  cout<<a[i][j];

使用标准库函数begin和end

int a[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
for (auto p = begin(a);p!=end(a);++p)
 for(auto q = begin(*p);q!=end(*p);++q)
  cout<<*q;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值