c++ char* 赋值_c串 VS string
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();
}
执行结果:
说明:在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在内存中的形式如下图所示:
- 内存模型
数组名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
- 取字符串的子串使用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使用起来更方便。
更多推荐
所有评论(0)