0f6fb9c4626e584d454e4d35ae53a606.png

1. C-串

C++语言中有两种字符串,一种是从C语言兼容过来的,我们管它叫C-字符串,简称C-串。我在吕凤翥编著教程视频中讲到的就是C-串。通常这样使用:

char name[30]=“Tangshan”;/定义长度为30的字符类型数组

或 char *add="Tangshan";

C-串是一个值为0(ASCII码值为0)的字节作为结束符的字符序列,格式为双引号括起来的字符序列。看下面代码

#include using namespace std;void main(){char name[30]="Tangshan";char *add="JiansheRoad";cout<endl;
 cout<endl;cout<endl;
 getchar();
}

执行结果:72a5f270e1597874529d817edbbcadd9.png

说明:在C语言中,计算字符串长度的函数在string.h这个头文件中,在标准C++由于iostream头文件包含了string.h头文件,所以程序里省略了

#include  这个头包含预处理指令

  • C串输出

分析输出:

输出数组名name,显示从这个地址开始到0字节结束的字符串;

输出字符指针add,显示从这个地址开始到0字节结束的字符串;

输出地址的间接引用那么*name,则显示单个字符。

name变量的空间大小是30个字节;

字符串长度是\0字节前字符串的个数。

例如有以下两条说明数组和字符指针的语句

char name[30]="Tangshan";//字符数组

char *add="Tangshan"; //字符指针

那么name在内存中的形式如下图所示:

  • 内存模型ab1ffd9c3ff60fd41827e26919c1f97b.png数组名name是地址,字符指针add也是地址,两个地址的值是不一样的,name空间大小是30字节,add指针空间大小是4个字节,存的是字符串"Tangshan"的首地址。
  • 不可以用关系运算符进行比较

因此如果想比较两个字符串是不是一样,使用条件语句:

if(name==add) cout<<"相同"<else cout<<"不同"

输出结果:不同

因为这样比较是比较两个地址的值,显然两个地址的值是不一样的。

  • 使用字符串比较函数strcmp()

这个函数的原型是 int strcmp(char *p1,char *p2两个字符串是否相同,):比较p1和p2两个字符串是否相同,如果相同返回0,否则比较到不相同的字符为止,返回前面字符减去后面字符的差。因此比较字符串的语句改写如下:

if( !strcmp(name,add)) 
  cout<<"相同"< else cout<<"不同"<

输出结果:相同

  • 不可以直接用赋值符号给字符数组赋值

name="Tangshan Teacher College"; //错×

  • 使用字符串拷贝函数strcpy()

使用strcpy(name,"Tangshan Teacher College"); //正确 √

给字符串赋值

char * strcpy(char s1[],char s2[]) s1是目标串,s2是原串

表示把s2字符串赋值给s1,要求s1有足够容纳s2字符的空间。

  • 字符串连接

char * strcat(char s1[],char s2[])

s2字符串连接到s1后面,合成一个字符串,函数的返回值类型是字符串,函数的返回值同样是合并后的字符串s1

char name[30]="Tangshan";char *add=" Jianshe Road";strcat(name,add);cout<endl;

执行结果:Tangshan Jianshe Road

4564d57ebbeff1977f7cd7c23e30c37f.png
  • 取字符串的子串使用strncpy()函数 char * strncpy(char s1[],char s2[],int n)

s1是目标串,s2是原串,取s2中前n个字符拷贝到s2中,但是仅仅拷贝字符,字符后没有字符串结束标志,因此,需要自己加上'\0'这个ASCII码为0的字符。

 #include using namespace std;void main(){char name[30]="Tangshan";char *add="Jianshe  Road";char str[6];cout<endl;
    strncpy(str,add,2);//拷贝add字符串的前两个字符"Ji"到str字符串
 str[2]='\0';//给第3个字符加字符串结束标记
 cout<endl;
 getchar();
}

上面程序段执行结果为:Ji

如果想从add字符串的第3个字符开始拷贝2个字符,可以用下面的语句

strncpy(str,&add[2],2);
str[2]='\0';

这样执行结果取出来的字符串:ns

  • 另外在输出上与数值型数组明显不同
  int ar[5]={2,3,4};cout<endl;

输出结果是地址的值,字符数组的特点就是输出数组名,或者是字符数组里某一个字符的地址的值,输出的就是从这个地址开始到0字节结束的字符串

  • 根据输入字符个数申请空间(动态数组)

问题引入:处理多个字符串,但字符串的长度差别很大,有的几个字符,有的几百个字符,使用C-串,定义字符串数组的时候,不好确定每个字符串的长度是多大,这种情况下,特别希望根据实际的需要定义字符数组的长度,因此就用到了动态数组,可以用如下的处理办法:

#include using namespace std;void main(){char tmp[300];//先说明个字符数组,数组空间足够大,可以放下最长的字符串char *charAr[5];//字符串数组;长度位50for(int i=0;i<5;i++)
 {cout<<"输入字符串:";cin>>tmp;//输入字符串int n=strlen(tmp);//计算本次输入字符串的长度
 charAr[i]= new char[n+1];//使用new 运算符从堆空间申请n+1个字符的长度strcpy(charAr[i],tmp);//把字符串从临时空间拷贝过去 
 }
 getchar();
}

以上是C-串在定义和使用中常遇到的问题和解决方法

string类

string是一种自定义的类型,它处理空间占用问题是自动的,需要多少,用多少,很少方便。需要添加头包含文件

  • 定义字符串类型的对象 赋值  拼接
 string str1,str2;//定义两个字符串对象
 str1="Tangshan";//可以直接赋值
 str2=" Teacher College";cout<endl;//字符串拼接
 //输出结果为 Tangshan Teacher College

可以赋值,可以拼接字符串

  • 使用compare方法进行比较
 string str1,str2;//定义两个字符串对象
 str1="Tangshan";//可以直接赋值
 str2=" Tangshan";if(str1.compare(str2))//两个字符串比较cout<<"相同";else cout<<"不同"<<endl;//输出结果为 相同
  • 使用关系运算符比较
string str1,str2;//定义两个字符串对象
 str1="Tangshan";//可以直接赋值
 str2="Tangshan";if(str1==str2)//使用关系运算符比较cout<<"相同";else cout<<"不同"<<endl;//输出结果为 相同
  • 取子串的操作

从下标为i的位置取k个字符

substr(i,k)

  string str1,str2;//定义两个字符串对象
 str1="Tangshan";//可以直接赋值
 str2=str1.substr(1,3);//从1下标位置开始取3个字符
 cout<

取字符串的前i个字符

str=str.Substring(0,i)

从右边开始取i个字符:

str=str.Substring(str.Length-i);

  • 给字符串排序
#include  #include #includeusing namespace std;void main(){string str1,str2;//定义两个字符串对象
 str1="Tangshan";//可以直接赋值
 sort(str1.begin(),str1.end());//sort排序函数在algorithm头文件中cout<endl;//输出ang
 system("pause");
}  
  • 使用字符串中的字符
  string str1;//定义一个字符串对象
 str1="Tangshan";//可以直接赋值cout<3]<<endl;//g  用下标 取下标是3的字符
 cout<3)<<endl;//g 用at函数 取下标是3的字符
 system("pause");

string类功能非常强大,还有很多方法,边用边查吧。

总结

上面用两种方法,分别是用字符数组,字符指针定义的C-串,用string类定义字符串对象两中方法分别对字符串进行操作,不难看出使用字符数组或字符指针操作字符串的方法比较陈旧,string使用起来更方便。fbb30b25768e814ebd37b0489a2b4821.png

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐