C语言复习 -- 字符串

概念&定义

字符串 -- 就是字符数组

两种定义方式:


char str[]="hello";    //字符串变量,能修改
char *str1="hello";   //字符串常量,不允许被修改

printf -- %s -- 控制字符串输入

//野指针 -- 没有明确的内存指向


#include<stdio.h>

int main()
{
    
    char  str[]={'h','e','l','l','o'};
char str2[]="hello";
    char *str3="hello";
    // for(int i=0;i<5;++i)
    // {
        // printf("%c",*(str3+i));
        
    // }

    str2[3]='m';
        printf("%s\n",str2);
        // str3[0]='m'; // 不可以
            printf("%s\n",str3);
    return 0;
}


================================================

字符串和字符数组的区别:  -- ‘/0’

char  str[]={'h','e','l','l','o'};
char str2[]="hello"; //在调用的"" 修饰字符串的时候,会在最后一个字符后面加入字符串结束标准-- '/0'
str2[] ={'h','e','l','l','o','/0'};

验证程序:


#include<stdio.h>

int main()
{
    
char  str[]={'h','e','l','l','o'};
char str2[]="hello";
char *str3="hello";
int len1=sizeof(str)/sizeof(str[0]);
int len2=sizeof(str2)/sizeof(str2[0]);
int len3=sizeof(str3)/sizeof(str3[0]);

printf("len1: %d\n",len1); // 5
printf("len2: %d\n",len2); // 6
printf("len3: %d\n",len3); // 8  -- 他是一个指针


    return 0;
}


================================================

sizeof  和 strlen ---的区别

计算字符串大小一般使用 strlen -- 只计算有效字符的长度 ,不算'/0'


sizeof  -- 计算整个数组的大小
strlen  -- 计算有效字符的大小


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

int main()
{
    
char  str[]={'h','e','l','l','o'};
char str2[100]="hello";

printf("sizeof() -- %d\n",sizeof(str2)); // 100 后面多个,未初始化的空间用'/0'填充
printf("strlen() --%d\n ",strlen(str2));  // 5 个有效字符


char *str3="hello";

printf("sizeof(str3):%d\n",sizeof(str3)); //8  -- 指针
printf("sizeof(char*):%d\n",sizeof(char*));//8
printf("sizeof(int*):%d\n",sizeof(int*));//8

printf("strlen(str3):%d\n",strlen(str3)); //5

    return 0;
}

================================================

动态内存管理

malloc -- 动态开辟字符串:


原型:void* malloc(size); -- 分配所需的内存空间,并且返回指向这段空间的指针


注: malloc  在上面开辟空间,要到程序结束的时候才释放,需要手动free 释放
而 局部变量 是在栈 上面开辟的空间,出了函数就释放了

realloc  --  扩容


原型: void *realloc(void *ptr,size);
尝试重新调整 之前使用malloc 或者 calloc 所分配的内存块大小

free


原型: void free(void *ptr); -- 释放之前malloc,clloc,realloc 所分配的内存空间


-- 防止内存泄漏

memset();  -- 内存初始化


原型:void *memset(void *str,int c,size_t n);  ,作用是将某一块内存中的全部设置为指定的值

 

  • str指向要填充的内存块。
  • c是要被设置的值。
  • n是要被设置该值的字符数。
  • 返回类型是一个指向存储区s的指针。

   char *str;
    str=(char*)malloc(5);
    memset(str,'\0',5);
    


悬挂指针 -- 野指针的一种


当指针指向的内存空间已经被释放,但是该指针没有任何的改变,以至于仍然指向已经被回收的内存地址,这种情况下该指针就被称为悬挂指针。


int *p;
p=(int*)malloc(5);
free(p); //这个时候是悬挂指针
p=NULL; // 赋值后不再悬挂
p=(char*)malloc(20);

野指针
        野指针是指尚未初始化的指针,它指向的地址是未知的、不确定的、随机的。

产生的原因:
        释放内存后指针没有及时置空,依然指向该内存,有可能会出现非法访问的错误。

避免方法:
初始化置NULL
申请内存后判空
指针释放后NULL
使用智能指针

================================================

常见字符串操作API

输出字符串:put printf


char *str; 

puts(str);
printf("%s\n",str);


获取字符串:gets scanf


scanf("%s",str):
原型: char  *strcpy(char *dest,const char *src);


gets()
原型: char *gets(char* str);
: 因为改函数可以无限读取,容易发送溢出,溢出的字符覆盖到堆栈中的内容中,破坏其他变量的值

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char  *str="wasaiwnh";
    puts(str);
    printf("%s\n",str);
    char *str2;
    puts("请输入一个字符串:");
    //scanf("%s",str2);
    gets(str2);
    puts(str2);
    return 0;
}

strcpy();  -- 字符串拷贝

strcpy()-是将一个字符串复制到另一块空间地址中 的函数,‘\0’是停止拷贝的终止条件

原型: char* strcpy(char* destination,const char* source);

   1. 函数的参数:

char* destination---------目标字符串的首地址
const char* source------源地址:被复制的字符串的首地址,用const修饰,避免修改掉被拷贝的字符串
   2.函数的返回值类型:char*:返回的是目标字符串的首地址 

strncpy();  -- 字符串拷贝
char* strncpy(char* str,const char *scr,int count);  -- 指定复制长度count 的 拷贝

test  

重写上面两个拷贝
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char *myStrcpy(char *des,char *src )
{
if(des==NULL && src==NULL)
{
    return NULL;
}
//先把des 一开始的地址记录起来
char *start=des;
// while(*src!='\0')
// {
    // //写法1:
    // // *des=*src;
    // // des++;
    // // src++;
    
    // //写法2:
    // *des++=*src++;
// }

while((*des++=*src++)!='\0'); //先复制在判断

*des='\0'; //拷贝完记得,加上结束标识符
return start;
}
char *myStrncpy(char *des,char *src,int count)
{
if(des==NULL && src==NULL)
{
    return NULL;
}
//先把des 一开始的地址记录起来
char *start=des;

while(*src!='\0' && count >0)
{
    *des++=*src++;
    count--;
}

if(count){
    while(count)
    {
        *des++='\0';
        count--;
    }
    return des;
}

*des='\0'; //拷贝完记得,加上结束标识符
return start;
}

int main()
{
    //char str[100]={'\0'};
    char *str;
    str = (char*)malloc(100);
    
    char *p="megniDXASDFA";
    //myStrcpy(str,p);
    myStrncpy(str,p,20);
    puts(str);
    return 0;
}


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    // int *p;
    // p=(int *)malloc(1); // 给指针p 分配内存空间,防止野指针
    // *p=11;
    // printf("1 %d\n",*p);
    // free(p);
    // printf("2 %d\n",*p);
    
    char *str;
    str=(char*)malloc(5);
    int len1=strlen("mxmxdhljkdadsadadadsada");
    printf("扩容前地址 -- %p\n",str);
    int moreLen=len1-5+1; // +1 -- '/0'
    realloc(str,moreLen);
        printf("扩容后地址 -- %p\n",str);
    strcpy(str,"mxmxdhljkdadsadadadsada"); //越界了
    puts(str);
    
    
    return 0;
}


assert(断言)


-- if else 的替代品:
用法:
include<assert.h>
 assert(expression);
作用: 计算表达式experrsion的值,if为假,他的stderr打印一条错误信息,通过aboor来终止程序运行

//报错信息

Assertion failed!

Program: D:\All_for_code\code_of_c\a.exe
File: stringT2.c, Line 7

Expression: des!=NULL && src!=NULL

===================================================

strcat -- 字符串拼接


原型: char  *strcat(char *dest,const chatr *src);
将src所指向的字符串复制到 dest所指向的字符串后面,(删除dest末尾的‘\0’),请确保dest足够长,返回指向dest的指针


#include<stdio.h>
#include<string.h>
#include<assert.h>
char *myStrcat(char *des,char *src)
{
    assert(des!=NULL && src!=NULL);
    
char* start=des;    
    
    while(*des != '\0')
    {
        des++;
        }
    while((*des++ = *src++)!='\0');
    *des='\0';
    
    return start;
    
}


char *myStrcat2(char *des,char *src)
{
    char *start=des;
    strcpy(des+strlen(des),src);
    return start;
    
}
int main()
{
    char str[50]="merngxoiangege";
    char *p;
    char *p2=" hamesome";
    p=myStrcat2(str,p2);
    puts(p);
    puts(str);
    return 0;
}

===================================================


strcmp --字符串比较 -- 主要判断是否相等



原型: int strcmp(const int*s1,const int* s2) --
返回值: // 字符比较大小遵循字典数 -- 比较完前面的,才比较后面的
 s1 = s2 返回0 
 s1 > s2 返回正数 -- 1
s1<s2  返回负数   -- -1


strncmp -- 只比较前n个字节

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

int myStrcmp(char *str1,char *str2)
{
    int res=0;
    int n1,n2;
    char *sta1=str1;
    char *sta2=str2;
    while(*str1&&*str2&&(*str1==*str2))
    {
        str1++;
        str2++;
    }
    if( *str1|| *str2)
    {
        str1=sta1;
        str2=sta2;
      while(*str1)
      {
        n1+=*str1;
        str1++;
      }        
        while(*str2)
      {
        n2+=*str2;
        str2++;
      }            
        
    }    
    
    res=n1-n2;
    if(res>0)res=1;
    else if(res<0) res=-1;
    else res=0;
    
    return res;
    
}


int main()
{
    char *p1="mengxiangjunb";
    char *p2="mengxiangjunb";
    int res = myStrcmp(p1,p2);
    printf("%d\n",res);
    
    
    return 0;
}


===================================================
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/498336.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Machine Learning机器学习之贝叶斯网络(BayesianNetwork)

目录 前言 算法提出背景&#xff1a; 贝叶斯算法特点&#xff1a; 一、贝叶斯定理 二、朴素贝叶斯分类模型 1、朴素贝叶斯分类模型&#xff08;Naive Bayes Classifier&#xff09; 2、原理 2.1 朴素贝叶斯假设 2.2条件独立性假设 2.3后验概率计算 2.4类别预测 2.5小结 3、建模…

【LeetCode热题100】236. 二叉树的最近公共祖先(二叉树)

一.题目要求 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可…

【计算机网络】http协议的原理与应用,https是如何保证安全传输的

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

BOM系统:贯穿制造全程的管理利器

在制造行业中&#xff0c;BOM系统的应用已经成为提高生产效率、降低成本和确保产品质量的关键因素。BOM系统作为产品结构和物料清单的管理工具&#xff0c;为制造企业提供了全面的控制和协同能力。 1.产品设计与开发&#xff1a;在产品设计阶段&#xff0c;BOM系统为工程师提供…

uniapp 真机调试(mumu模拟器)

配置mumu模拟器 一、下载Mumu模拟器 https://mumu.163.com/ 二、点击安装&#xff0c;按步骤下一步安卓mumu模拟器 三、打开mumu多开器 右上角adb查看 端口号 四、打开mumu模拟器 五、打开HbuilderX 选择运行&#xff0c;运行到手机模拟器&#xff0c;Android模拟器端口设置…

基于ssm网上服装销售系统论文

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于网上服装销售系统系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了网上服装销售系统系统&#xff0c;它彻底…

安卓调试桥ADB

Logcat 命令行工具 | Android Studio | Android Developers 什么是ADB ADB 全称为 Android Debug Bridge &#xff0c;是 Android SDK &#xff08;安卓的开发工具&#xff09;中的一个工具&#xff0c;起到调试桥的作用&#xff0c;是一个 客户端 - 服务器端程序 。其中 …

泛型,数据结构,集合

文章目录 泛型介绍解决问题好处使用通配符泛型的下限泛型的上限 数据结构定义常见的数据结构栈(先进后出)队列(先进先出)数组结构链表结构哈希表结构 集合List集合特点特有方法子类及其底层数据结构LinkedList集合 Set集合特点没有特有方法子类及其底层数据结构LinkedHashSet集…

HarmonyOS 应用开发之Want的定义与用途

Want 是一种对象&#xff0c;用于在应用组件之间传递信息。 其中&#xff0c;一种常见的使用场景是作为 startAbility() 方法的参数。例如&#xff0c;当UIAbilityA需要启动UIAbilityB并向UIAbilityB传递一些数据时&#xff0c;可以使用Want作为一个载体&#xff0c;将数据传递…

I.MX6ULL_Linux_系统篇(25) buildroot文件系统构建

前面我们学习了如何使用 busybox 来构建根文件系统&#xff0c;但是 busybox 构建的根文件系统不齐全&#xff0c;很多东西需要我们自行添加&#xff0c;比如 lib 库文件。在我们后面的驱动开发中很多第三方软件也需要我们自己去移植&#xff0c;这些第三方软件有很多又依赖其他…

Linux命令及中间件安装

一.Linux简介 1.Linux操作系统概述 Linux是基于Unix的开源免费的操作系统&#xff0c;由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境。Linux是由Linus Torvalds&#xff08;林纳斯托瓦兹&#xff09;起初开发的&#xff0c;由于源代码的开放性&#xff0c;现在…

系统分析师-数学与经济管理

系统架构设计师 系统架构设计师-软件开发模型总结 文章目录 系统架构设计师前言一、最小生成树二、最短路径三、网络与最大流量四、不确定型决策 前言 数学是一种严谨、缜密的科学&#xff0c;学习应用数学知识&#xff0c;可以培养系统架构设计师的抽象思维能力和逻辑推理能…

sheng的学习笔记-AI-人脸识别

目录:sheng的学习笔记-AI目录-CSDN博客 需要学习卷机神经网络等知识&#xff0c;见ai目录 目录 基础知识&#xff1a; 人脸验证&#xff08;face verification&#xff09; 人脸识别&#xff08;face recognition&#xff09; One-Shot学习&#xff08;One-shot learning&…

探索数据库--------------mysql主从复制和读写分离

目录 前言 为什么要主从复制&#xff1f; 主从复制谁复制谁&#xff1f; 数据放在什么地方&#xff1f; 一、mysql支持的复制类型 1.1STATEMENT&#xff1a;基于语句的复制 1.2ROW&#xff1a;基于行的复制 1.3MIXED&#xff1a;混合类型的复制 二、主从复制的工作过程 三个重…

踏入网页抓取的旅程:使用 grequests 构建 Go 视频下载器

引言 在当今数字化的世界中&#xff0c;网页抓取技术变得越来越重要。无论是获取数据、分析信息&#xff0c;还是构建自定义应用程序&#xff0c;我们都需要从互联网上抓取数据。本文将介绍如何使用 Go 编程语言和 grequests 库来构建一个简单的 Bilibili 视频下载器&#xff…

《亮数据:爬虫数据采集行业痛点的利器》

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

IDEA2023使用手册 【持续更新...】

IDEA介绍 IDEA官网&#xff1a;https://www.jetbrains.com.cn/idea/IDEA 2023.2.2下载地址&#xff1a;https://download.jetbrains.com/idea/ideaIU-2023.2.2.exe对第三方软件的支持&#xff1a;https://www.jetbrains.com/legal/third-party-software/?productiiu&versi…

gin | gin会话控制

会话控制 Cookie介绍 HTTP是无状态协议&#xff0c;服务器不能记录浏览器的访问状态&#xff0c;也就是说服务器不能区分两次请求是否由同一个客户端发出&#xff1b;Cookie 就是解决 HTTP 协议无状态的方案之一&#xff0c;中文是小甜饼的意思&#xff1b;Cookie 实际上就是…

香港90年代著名女歌手病逝终年58岁 抗癌大半年今早睡梦中离世

90年代玉女歌手黎明诗 (Stephanie) 今日&#xff08;3月28日&#xff09;惊爆病逝的消息&#xff0c;终年58岁。不少圈中朋友已收到消息&#xff0c;得悉她的死讯都大感惋惜。据知黎明诗积极抗癌大半年&#xff0c;今早在睡梦中离开。 黎明诗退出乐坛多年&#xff0c;其后在201…

Colorize (Texture Color Palette Modifier)

Colorize提供了无与伦比的区域颜色调整和效果控制,如使用纹理调色板的模型的发射、金属反射和模拟金属遮挡。 Colorize彻底改变了你在Unity中为3D模型添加颜色和生命的方式。无论你是一个独立开发者、艺术家,还是一个大型团队的一员,Colorize都提供了一套直观、强大的工具,…