C语言—字符串
文章目录
//字符数组
char word[]={'H','e','l','l','o','!'};
//字符串
char word[]={'H','e','l','l','o','!','\0'};
- 以0(整数0)结尾的一传数组。(0或者’/0’是一样的(数值:48或者0x30),但是和’0’是不同的)
- 0标志字符串的结束,但是它不是字符串的一部分
- 计算字符串的长度的时候也不包含0
- 字符串以数组的形式存在,以数组或者指针的形式访问(更多的时候使用指针)
- 需要使用到的头文件:string.h里边的函数来处理字符串
字符串变量
//定义
char *str="Hello";
char world[]="Hello";
char world[10]="Hello"; //\0编译器会自动生成
"Hello"
会被编译器变成一个字符数组放在某处,数组的长度为6(结尾有’\0’)
注意:
- 不能用运算符对字符串做运算
- 通过数组的方式可以遍历字符串
- 指针形式定义的字符串位于代码段,只能读,不能写
- 使用数组的方式定义字符串,可以读写
char *str="Hello"; //只能读,不能写
char world[]="Hello"; //能读能写
总结:
1.构造一个字符串:用数组的形式:
2.处理一个字符串:用指针的形式
3.char*不一定是个字符串,只有它指向带0的数组才是字符串
字符串的输入输出
char string[8];
scanf("%s",string);
printf("%s",string);
scanf
读入结束标志**:空格,tab,回车**
注意:scanf
是不安全的,因为不知道要读入内容的长度
解决问题:限制输入的个数
scanf("%7s",string);
字符串的常见错误:
1.以为char*就是字符串类型,定义了一个字符串类型的变量就直接使用
//错误使用
char *string;
scanf("%s",string);
空字符串
char buffer[100]="";//空字符串,buffer[0]='\0'
char buffer[]=""//数组的长度为1!放不下任何字符串
字符串数组
char **a;
:表示a是一个指针,指向另一个指针,那个指针指向一个字符串
char a[][10]
:表示有一大片空间,但是这个数组的每个单元最多放10个字符(包括’\0’)
char *a[]
:表示数组的每一个单元都是指针,指向一个地址空间,每一个单元可以存放无限制的字符串。
单字符的输入输出
putchar函数(输出)
int putchar(int c)
- 出写一个字符
- 返回写了几个字符,EOF(-1)表示写失败
getchar函数(输入)
int getchar(void)
- 读入一个字符
- 返回类型为int是为了能返回EOF(-1)
字符串函数
在string.h
的头文件中
strlen
函数
原型:size_t strlen(const char *s)
作用:返回s字符串的长度(不包括结尾的0)
const
的作用:保证不修改传进来的函数
//自己封装计算字符串长度的函数
int mylen(const char *s)
{
int cnt;
while(*s++!=0)
{
cnt++;
}
return cnt;
}
strcmp
函数
原型:int strlen(const char *s1,const char *s2)
作用:会根据 ASCII 编码依次比较 s1 和 s2 的每一个字符,直到出现不到的字符,或者到达字符串末尾(比较两个字符串。返回:
0 | s1==s2 |
---|---|
1 | s1>s2 |
-1 | s1<s2 |
//自己封装比较字符串的函数
int mycmp(const char *s1,const char *s2)
{
int cnt;
while(1)
{
if(s1[cnt]!=s2[cnt])
{
if(s1[cnt]>s2[cnt])
return 1;
else return -1;
}
else{
if(s1[cnt]=='\0')
return 0;
}
cnt++;
}
}
strcpy
函数
原型char* strcpy(char *restric dst,char *restric src)
作用:把src的字符串拷贝到dst(目标在前,源在后)
restrict表示str和dst的地址空间不能重叠
复制一个字符串
char *dst;
dst=(char*)malloc(strlen(string)+1);
strcpy(dst,string);
//自己封装复制字符串的函数
void mycpy(char *dst,const char *str)
{
while(*str)
{
*dst++=*str++;
}
*dst=0;
}
strcat
函数
原型cahr* strcat(cahr *restrict s1,const cahr *restrict s2)
作用:把s1拷贝到s2的后面,接成一个长的字符串
返回:s1
字符串找字符
cahr* strchr(const char *s,int c)
找第一次出现c的字符
cahr* strrchr(const char *s,int c)
从右边找第一次出现c的字符
返回值:一个指针,指针的地址为找到字符的地址。如果没有找到返回NULL
如何找第二个字符?
char *string="Hello";
strchr(string,'l'); //寻找第一次出现的'l'
strchr(strchr(string,'l')) //寻找第二次出现的'l'
字符串找字符串
char* strstr(const char *s1,const cahr *s2)
寻找过程中区分大小写
char* strasestr(const char *s1,const cahr *s2)
寻找过程中不区分大小写
安全问题
strcpy
和strcat
都有可能出现安全问题:目的的地址空间不足。