C语言循序渐进之字符串字符串

字符串

#include <stdio.h>

int main()
{
    int data[] = {1,2,3,4,5};
    char cdata[] = {'h','e','l','l','o'};
    char cdata2[] = "hello";
    char *pchar = "hello";//字符串常量,不允许被修改
    char c = 'c';
    
    char *p;//野指针,并没有明确的内存指向  
    *p= 'a';
    cdata2[3] = 'm';
    printf("%s",cdata2);
    putchar('\n');
    puts(cdata2);
    *pchar = 'm';
    puts("end");
    /*
    int i;
    for(i=0;i<5;i++){
        printf("%c",*(pchar+i));
    }*/
    return 0;
}

字符串存放方式及结束标志

#include <stdio.h>
#include <string.h>

//strcpy strcmp strcat strstr
int main()
{
    //字符串和字符数组的区别;
    int data[] = {1,2,3,4,5};
    //请计算数组data的元素个数
    char cdata[6] = {'h','e','l','l','o'};//字符串的结束标志'\0'
    char cdata2[] = "hello";
    
    int len = sizeof(data)/sizeof(data[0]);
    printf("len = %d\n",len);
    
    len = sizeof(cdata2)/sizeof(cdata2[0]);
    printf("len = %d\n",len);
    
    len = sizeof(cdata)/sizeof(cdata[0]);
    printf("len = %d\n",len);
    
    printf("%s\n",cdata);   
    return 0;
}

sizeof & strlen 的区别

#include <stdio.h>
#include <string.h>

void test()
{
    
}
//strcpy strcmp strcat strstr
int main()
{
    char cdata[128] = "hello";//'\0'
    void (*ptest)();
    ptest = test;
    printf("sizeof :%d\n",sizeof(cdata));
    printf("strlen: %d\n",strlen(cdata));
    
    char *p = "hello";
    //p是一个char *,sizeof来计算的时候,得出是计算机用多少字节来表示一个地址
    printf("sizeof:p      :%d\n",sizeof(p));
    printf("sizeof:char*  :%d\n",sizeof(char *));    //地址
    printf("sizeof:int*  :%d\n",sizeof(int *));        //地址
    printf("sizeof:char   :%d\n",sizeof(char));
    printf("sizeof:ptest   :%d\n",sizeof(ptest));
    printf("strlen        :%d\n",strlen(p));
    
    return 0;
}

malloc开辟动态空间

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//char *strcpy(char* dest, const char *src);
int main()
{
    char *p;//野指针
    p = (char *)malloc(1);//p有了具体的内存指向
    
    *p = 'c';
    free(p);//动态开辟后重新指向,记得释放。不然存在内存泄露的风险
    p = NULL; //free之后让指针指向NULL,防止悬挂指针
    p = (char *)malloc(12); //开辟12字节的内存空间
    if(p == NULL){          //通常养成习惯对malloc返回值做NULL判断,申请失败了
        printf("malloc error\n");
        exit(-1);
    }
    memset(p,'\0',12);   //内存空间初始化
    printf("扩容地址:%x\n",p);
    int len = strlen("chenlichen2342354364575467");
    int newLen = len - 12 + 1; // 1:为'\0'
    p = realloc(p,newLen); //扩容
    printf("扩容后地址:%x\n",p);
    strcpy(p,"chenlichen2342354364575467");
    puts(p);
    puts("end");
    return 0;
}

strcpy函数(拷贝)

#include <stdio.h>
#include <string.h>
int main()
{
    char *p = "chuanzuozhongxin";
    char str[128] = {'\0'};
    

    puts(p);
    printf("%s\n",p);
    
    puts("请输入字符串");
    //scanf("%s",str);
    //gets(str);
    //strcpy(str,p);
    strncpy(str,p,6);    //sgtrcpy(目标文件,源文件,拷贝字符大小)
    puts(str);
    return 0;
}

实现字符拷贝

#include <stdio.h>
char *mystrcpy(char *des,char *src)
{
    if(des == NULL || src == NULL){
        return NULL;
    }
    char *bak = des;
    while((*des++ = *src++) != '\0'); 
    des = '\0';
    return bak;
}
char *mystrncpy(char *des,char *src,int count)
{
    if(des == NULL || src == NULL){
        return NULL;
    }
    char *bak = des;
    
    while((*des++ = *src++) != '\0' && count > 0){  //while(*src )
        //*des++ = *src++;
        //printf("%d\n",count);
        count--;
    }
    if(count > 0){
        *des++ = '\0';
    }
        des = '\0';
    return bak;
}

int main()
{
    char *p = "zifuchuankaobei";
    char des[128] = {'\0'};
   // mystrcpy(des,p);
    //puts(des);
    mystrncpy(des,p,7);
    puts(des);
    return 0;
}

assert断言函数

#include <stdio.h>
#include <assert.h>
char *mystrcpy(char *des,char *src)
{
    assert(des != NULL && src != NULL);        //assert断言
    char *bak = des;
    while((*des++ = *src++) != '\0'); 
    des = '\0';
    return bak;
}
char *mystrncpy(char *des,char *src,int count)
{
    if(des == NULL || src == NULL){
        return NULL;
    }
    char *bak = des;
    
    while((*des++ = *src++) != '\0' && count > 0){  //while(*src )
        //*des++ = *src++;
        //printf("%d\n",count);
        count--;
    }
    if(count > 0){
        *des++ = '\0';
    }
        des = '\0';
    return bak;
}

int main()
{
    char *p = "zifuchuankaobei";
    char des[128] = {'\0'};
   // mystrcpy(des,p);
    //puts(des);
    mystrncpy(des,p,7);
    puts(des);
    return 0;
}

strcat(拼接)

#include <stdio.h>
#include <string.h>
char *mystrcat(char *des,char *src)
{
    char *back = des;
    for(;*des =='\0';des++);
    while((*des++ = *src++) != '\0');
    *des = '\0';
    return back;
}
int main()
{
    char p[128] = "666"; //注意目标文件内存空间问题
    char *p2 = "888";
    strcat(p,p2);
    puts(p);
    return 0;
}

stecmp(比较)

#include <stdio.h>
#include <string.h>
int mystrcmp(char *str1,char *str2)
{
    int  ret = 0;
    int     n_str1 = 0;
    int     n_str2 = 0;
    char *nstr1 = str1;
    char *nstr2 = str2;
    while(*str1 ){
        n_str1 += *str1;
        str1++;
    }
    while(*str2){
        n_str2 += *str2;
        str2++;
    }
    str1 = nstr1;
    str2 = nstr2;
    while(*str1 && *str2 && (*str1 == *str2)){
        str1++;
        str2++;    
    }
    ret = n_str1 - n_str2;
    if(ret > 0){
        ret = 1;
    }
    if(ret < 0){
        ret = -1;
    }
    return ret;
}
int main()
{
    int ret;
    char *p = "abcd";
    char *p2 = "abdce";
    ret = mystrcmp(p,p2);
    //ret = strcmp(p,p2);
    printf("ret = %d\n",ret);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值