字符数组,字符指针,字符串
char a[]="hello world";
char* b="hello world";
string c="hello wolrd";
cout<<a<<endl;
cout<<b<<endl;
cout<<sizeof(a)<<endl; 12
cout<<strlen(a)<<endl; 11
cout<<sizeof(b)<<endl; 4
cout<<strlen(b)<<endl; 11
cout<<sizeof(c)<<endl; 16
String不是基本的数据类型,所以strlen函数无法传入这个参数
字符串操作是一个不小的主题,在标准C++中,string字符串类成为一个标准,之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下的需要.
Sizeof是运算符,而strlen则是一个函数,sizeof往往在编译的时候就已经把结果计算出来,给出strlen的函数原型
int strlen(const char *str)
{
int len = 0;
assert(str != NULL);//debug模式下如果str为空,则抛出一个断言 while(*str++)
{
len++;
}
return len;
}
C语言中,当一个字符串存入一个数组时,也把结束字符\0存入数组一次判断该字符串是否结束的标志。
字符串比字符多占一个字节
可以用输入和输出函数一次性输入输出一个字符数组中的字符串,而不必用循环语句逐个输入输出每个字符
格式化输出字符串是,输出项是字符数组名,不能写成数组中的元素
输入函数的输入项直接写数组名,不写地址符&
输入函数遇到空格认为结束
字符串指针和字符数组的区别
字符串指针是一个变量,用于存放字符串的首地址
字符数组时有若干个数组元素组成的,用于存放整个字符串
不能对数据进行赋值,只能在初始化的时候把字符串赋值给数组的各元素,赋值时只能对字符数组的各元素逐个赋值。
定义字符数组时,编译系统为他分配内存单元,具有确定的地址,
定义字符指针时,给指针变量分配内存单元,在其中可以放一个字符变量的地址,如果未赋值地址则她没有指向一个确定的字符数据。
两个字符数组变量不能直接赋值,只能通过移动下标操作字符数组的每个元素进行分别赋值
两个字符值指针,可以直接赋值,即把一个字符指针所指向的地址赋值给另一个指针,则两个指针指向的同一个地址。
字符数据和字符串两者之间不能直接赋值
字符和字符串处理的函数
字符输入,输出函数:其函数在头文件stdio.h中声明,使用前应包含头文件
1.字符串strlen()的值,是否和她占据内存空间相同?
strlen()函数的返回值不包含‘/0’字符,
所以它比他占据的空间小1(所占据的空间可用sizeof确定),
此函数声明在<string.h>中
他的返回值是size_t型,声明在<stddef.h>中,Typedef unsigned int size_t;
2.strcpy函数存在的潜在风险,如何避免?
strcpy(string1,string2);将string1复制到string2中,这个复制包含'/0'。
风险之一就是string2的长度比string1长的话,string1就不包含'/0',没有结束符号会在以后使用中带来很大的问题
可以增加一个判断
if(sizeof(string2)<=sizeof(string1))
strcpy(string1,string2);
else
pringtf("源字符串太长");
3.不要试图输出一个没有字符串结束标志的数组,一下代码是错误的,
char str[] = {'h', 'e', 'l', 'o'};
printf("%s",str);
purts(str);
由于字符数组str没有结束符'/0',printf和puts会在输出hello后,继续遍历后面的内存单元,直到遇到/0为止,这样会输出不确定的字符
4.strcpy(),strcat(),strcmp(),strncpy(),strncat(),内部到底是如何运行的?
strcpy()是把源字符串复制到目标字符串,复制包含了终止符'/0',目标字符串原有的信息将被删除,原字符串不变
strcat()把原字符串复制到目标变量的结尾,源字符串不变
strcmp(string1,string2),比较两个字符串,返回一个小于,等于,大于0的值,对应string1小于;等于,大于string2;目标字符串和员字符串不变
strncpy(string1,string2,n);把源字符串string2的前n个字符复制到string1中,此复制不包含终止符/0,源字符串不变
strncat(string1,string2,n);把源字符串string2的前n个字符复制到目标字符串string1的结尾,源字符串不变
String类中集成函数的一些用法
String s("hehe");
Char chs[]="hehe"
String s(chs); string s(chs,1,3); string s2(s1);
string s(chs,3)前三个
String s(10,'k') 分配10个字符。
初值都是k
s.assign("kdje") s.assign("asdsadsa",5)
s1.Swap(s2);互换
s.append("hehe")添加字符串 a.push_back('k')添加一个字符
s.insert(0,"头部"); //在头部插入
s.insert(s.size(),"尾部"); //在尾部插入
s.insert(s.size()/2,"中间"); //在中间插入
string s = "abcdefg";
s.erase(0,1); //从索引0到索引1,即删除掉了'a'
string str = s.substr(5,3);//从索引5开始3个字节
s.max_size()
s.empty())
s.at(i)。