版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mozha_666/article/details/79582100
C语言中的字符串
1、字符串:被引号引起的一串字符,就是字符串,系统会自动在这段字符末尾加上结束标志‘\0’
2、C语言中并没有定义字符串变量,所以C语言中字符串是以常量存在,存储在进程空间的data区的ro区域
3、编译时候处理成指向常量字符串的指针,不能改变字符串的内容,不能改变指向
const char * const //字符串的指针类型
4、如果要改变字符串内容,则要把它放到字符数组中去,
5、所以“china”的实质是字符数组
char str[] = "china" //所以这个两者才可以等价
6、验证实例
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
printf("%s\n%p\n%c\n%c\n ",
"china","china",*"china","china"[3]);
return 0;
}
理解NULL和“”的区别
char *p = NULL;
char *q = "";
sizeof(p) //4,
sizeof(q) //1
上面表示的意思是,NULL是指针类型,所以sizeof(p) = 4;
“”表示空串,但是其实里面还有隐藏的一个结束标志‘\0’,此时“”代表一个字符数组,
所以sizeof(q)=1
字符数组写越界读越界问题
1、常用字符数组存放字符串,因为方便改变字符串的值。
2、读越界:
char str[5] = "china is great";
因为str只够存放5个元素,所以只能存放‘china’,此时str中就没有‘\0’结束标志,此时打印str,就会出现问题了,因为没有结束符,字符串读取时就会一直读下去直到遇到‘\0’或者内存崩溃
char str[5] = "china";
printf("%s",str);
比如这样也会出现读越界,因为”china”实际是6个字符,这种问题一般在编译时就会不通过。
3、写越界
char str[] = "china is great";
char strc[5];
strcpy(strc,str);
上面这段代码会出现写越界,copy时先从str读取“china”5个元素放入strc,此时没有结束标志符,那么系统就会一直写下去直到遇到结束标志符或者内存崩溃,一般读越界会造成写越界。
4、读、写越界的本质是‘\0’的问题,因为每个字符串结尾都应该有‘\0’表示字符串结束
自实现strlen()
#include<stdio.h>
#include<string.h>
int myStrlen(char *s){
int len = 0;
while(*s++){
len++;
}
return len;
}
/*
注意这里的返回值一定要是char * 为了连续拷贝方便
*/
char * myStrcpy(char *dst,const char *src){
//保留字符串首地址
char *d = dst;
//'\0' 也拷贝过来了,注意这里是覆盖不是追加
while(*dst++ = *src++);
return d;
}
int myStrcmp(const char *str1,const char* str2){
for(;*str1 && *str2;str1++,str2++){
if(*str1 == *str2){
continue;
} else {
return *str1 - *str2;
}
}
return *str1 - *str2;
}
char * myStrcat(char *dst,const char *src){
char *d = dst;
while(*dst)
dst++;
while(*dst++ = *src++);
return d;
}
int main(void){
char *s = "china";
char buf[100];
char buf2[200];
//printf("库函数求字符串长度%5d\n",strlen(s));
//strlen 和 myStrlen不能同时运行,有bug
printf("自实现求字符串长度%5d\n",myStrlen(s));
myStrcpy(myStrcpy(buf,s),"America");
printf("buf = %s\n",buf);
printf("buf - s:%d\n",myStrcmp(buf,s));
//myStrcat(buf2,s);
//FIXME
//printf("s+buf = %s\n",buf2);
return 0;
}