嵌入式学习_c语言基础day6

这篇博客介绍了C语言中字符串的使用,包括字符串变量和常量的区别、内存管理(malloc、free、realloc、memset)以及字符串处理函数。还讲解了如何避免野指针和悬挂指针,并提供了自定义的字符串复制和连接函数示例。
摘要由CSDN通过智能技术生成

第七章字符串

1、char str【】=“hello”;  字符串变量,可以修改

char *p=“hello”;     字符串常量,不可修改

char *p;     野指针

p=NULL;    空指针

2、对没有明确指向内存的野指针赋值会中断例如:  char *p; *p=‘a’;

但是 char *p;     p=(char *)malloc(12);*p=‘a’;就行了

3、字符串结束标志‘\0’,

char str【】=“hello”;  

int len =sizeof(str)、sizeof(str【0】)=6;系统会自动添加\0;

strlen(str)=5;  strlen计算的是有效字符长度

4、char *p;

malloc    使用malloc函数要添<stdlib.h>    p= (char *)malloc(12);

malloc实在堆区开创内存,内存只有在程序结束时才会被系统默认释放,所以需要自行用free释放; free(p);p=NULL;

realloc(p,int)在原有基础上再扩充n个字节内存

memset(p,‘\0’,12);将p中的12个字符变为\0

悬挂指针 :野指针的一种  char*p;p=NULL;

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int main(){

    char *p;     //野指针

    p=(char *)malloc(1);     //p有了具体的内存指向

    *p='c';

    free(p);                 //malloc 是在堆区创建内存,之后程序结束只有系统才会释放内存,使用之后需要手动free释放掉内存

    p=NULL;

    p=(char *)malloc(12);

    if(p==NULL){

        puts("malloc error!!!");

        exit(-1);             //退出程序,需要添加stdlib头文件

    }

    memset(p,'\0',12);      //将p所指的内存全部初始为\0;

    printf("扩容地址:%x\n",p);

    int len=strlen("1234567890123456");

    int newlen=len-12+1;    //加1是为了给\0留个位置

    realloc(p,newlen);      //realloc给p所指的内存空间额外增加newlen个空间

    printf("扩容后地址: %x\n",p);

    strcpy(p,"1234567890123456");         //strcpy(n1,n2)将n2复制到n1,需要加<string。h>,字符串赋值需要用到复制

    printf("%s\n",p );        //输出字符串,直接传入p指针即可,类似于数组名,不需要*截引用,如果要输出字符串中的字符,则输出%c ,*p;

    puts(p);

    return 0;

}

5、常见api

#include<stdio.h>

int main(){

    char *p="baoshuaizuishuai";

    char str[128]={'\0'};             //初始化赋值

    puts(p);

    printf("%s\n",p);

    puts("请输入字符串: ");

    // scanf("%s",str);

    gets(str);           //输入字符串

    puts(str);           //输出字符串,自带换行符

    return 0;

}

6、mystrcpy

#include<stdio.h>

char * mystrcpy1(char *str,char *p){

    if(str==NULL||p==NULL)       //assert(str!=NULL&&p!=NULL);  assert判断如果 为假,就会调用abort函数终止程序,但需要<assert.h>

    return NULL;

    char *des=str;

    while(*p!='\0'){

        *str++=*p++;

    }

    *str='\0';

    return des;

}

char * mystrcpy2(char *str,char *p){

    if(str==NULL||p==NULL)

    return NULL;

    char *des=str;

    while((*str++=*p++)!='\0');

    *str='\0';

    return des;

}

char* mystrncpy(char *str,char *p,int n ){

    if(str==NULL||p==NULL){

        return NULL;

    }

    char *des=str;

    while(*p!='\0'&& n>0){

        *str++=*p++;

        n--;

    }

    if(n>0){

        while(n>0){

            *str='\0';

            n--;

        }

        return des;

    }

    *str='\0';

    return des;

}

int main(){

    char str[128]={'\0'};

    char *p="wozhenniubi";

    mystrncpy(str,p,2);

    puts(str);

    return 0;

}

7mystrcat

#include<stdio.h>

#include<assert.h>

#include<string.h>

char* mystrcat1(char *str,char *p){

    assert(str!=NULL&&p!=NULL);

    char *des=str;

    while(*str!='\0')

        str++;

    while(*p!='\0')

        *str++=*p++;

        *str='\0';

        return des;

}

char* mystrcat2(char *str,char *p){

    assert(str!=NULL&&p!=NULL);

    char *des=str;

    while(*str!='\0')

        str++;

    while((*str++=*p++)!='\0');

         *str='\0';

         return des;

}

char* mystrcat3(char *str,char *p){

    assert(str!=NULL&&p!=NULL);

   char *des=str;

   strcpy(str+strlen(str),p);

   return des;

}

int main(){

    char str[128]="baoshuai";

    char *p=" zuishuai";

    mystrcat2(str,p);

    puts(str);

    return 0;

}

8、对字符串数组赋值要用strcpy;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值