C语言进阶——字符串

关键字 :C语言字符串
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mozha_666/article/details/79582100
————————————————
C语言中的字符串
1、字符串:被引号引起的一串字符,就是字符串,系统会自动在这段字符末尾加上结束标志‘\0’
2、C语言中并没有定义字符串变量,所以C语言中字符串是以常量存在,存储在进程空间的data区的rom区域
3、编译时候处理成指向常量字符串的指针,不能改变字符串的内容,不能改变指向
const char * const //字符串的指针类型​

4、如果要改变字符串内容,则要把它放到字符数组中去,
5、所以“china”的实质是字符数组

char str[] = "china" //所以这个两者才可以等价


6、验证实例

#include
#include
#include

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
#include

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;
}

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★博文作者未开放评论功能