C语言进阶——字符串

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/mozha_666/article/details/79582100
今日推荐