[应用方案] C语言中的字符串

[复制链接]
 楼主| 10299823 发表于 2025-6-17 23:26 | 显示全部楼层 |阅读模式
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;
}


您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

3628

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部