0727
第八章 字符串
一、字符串定义:以’\0’作为结尾标识的一串字符。
字符串在内存中存储时,是以字符数组形式存储。
字符串的管理方式(表示方式):字符指针和字符数组。
字符串与字符数组:存储形式相同,但是字符串必须有结尾识’\0’。
二、字符串初始化:
1)char*p=“hello”;//字符指针管理字符串(字符指针存储于栈区)
//将字符串首地址存入指针变量p中;其中“hello”存储于文字常量区。
//1)字符指针管理字符串注意:指针p对字符串”hello”只有读的权限,并不能对字符串“hello”(即文字常量区)的内容修改。如:p=“world”。相当于修改文字常量区的自读内容。会使系统崩溃(总之:不能通过指针修改文字常量区中的内容)
文字常量区的字符串的首地址的类型:const char*;
2)char c[6]=“hello”;//字符数组管理字符串(数组c存储于栈区)
//字符串存储于字符常量区,对数组的赋值相当于将字符串“hello”逐个拷贝。到’\0’为止。
3)char c1[]=“hello”;//同上,数组的大小根据赋值的字符串大小分配。
//一般为了防止内容溢出,采用3)这种初始化方式。
//2)和3)字符数组管理字符串注意:(strlen作用:求字符串的长度(不包括‘\0’)参数:字符串首地址)
修改字符串完成后,需要保证数组中存储的依旧为字符串(即存在‘\0’结尾),否则以%s格式输出可能会出现乱码。
三、字符串操作函数
<string.h>
1> strlen(char* str);//计算字符串的长度,字符数组不计算‘\0‘;
2> strcpy(char *str1,const char *str2)//复制拷贝字符串。str1:目的地址;str2:源地址。
注意:第二个参数为const类型是为了防止通过指针修改str2。
实际上是讲
例:char a[20];
char* p = (char*)”hello”;
for(int i=0;i<strlen(p)+1;i++){
a[i]=p[i];//此时也将字符数组p最后一位的‘\0‘也赋给字符数组a。这样数组a中存的是字符串。如果没有将’\0‘赋给数组a,则数组a中存的只是字符,并不是字符串。(字符串的定义。)
}
printf(“%s\n”,a);
使用strcpy函数需要注意:目的地址必须对应一块内存空间。
strcpy(a,”hello”);//hello的类型:const char*。将“hello”的首地址作为实参。
1)char *p=“hello”;
strcpy(p,”world”);//不合法。因为:p“指向”的内存空间为文字常量区中的空间(权限为只读)
2)char *q;
strcpy(q,”hello”);//不合法。因为:指针并没有”指向“一块有效内存空间,没有办法盛放字符串。
补充:printf(char* str1);scanf(char* str2);gets(char* str3);//单指字符串的输入和输出,这里不考虑其他类型。
printf(要输出的字符串的首地址);
scanf(可以写入的内存空间的首地址);//输入字符串以空格或回车结束。
gets(char* str3);//输入字符串以回车结束。
作业一:自定义函数求字符串长度(strlen)
int array_length(char *p){
int num=0;
while(*p){
num++;
p++;
}
return num;
}
作业二:自定义函数实现strcpy
void str_cpy(char *p,const char *q)
{
while(*q)*p++=*q++;
*p=‘\0’;
}
0728
接0727
三、字符串操作函数
3> strcmp:作用:实现两个字符串的比较。(逐个比较字符的ASCII码)
strcmp(参数一,参数二);const char* 例:“hello”<“yes”
返回值类型:int
>0:参数一“指向”的字符串>参数二“指向”的字符串;
==0:++++++++++++++==++++++++++++++++;
<0:++++++++++++++++<++++++++++++++++;
四、字符串数组:相同类型数据的集合
字符串数组:每一个元素都是char*类型,都是字符串的首地址
char* a[10];
typedef char* STRING;//STRING代替char*
STRING a[10];//等效于char* a[10];
