C/C++语言基础--字符串(包括字符串与字符数组、字符串与指针、字符串处理函数等),代码均可运行

news2024/9/29 9:37:17

本专栏目的

  • 更新C/C++的基础语法,包括C++的一些新特性

前言

  • 无论什么语言,字符串都是最重要、最基础的数据类型,他对二进制有很好的对应关系
  • 在C语言中没有提供专门的处理字符串的类型,但是我们可以通过字符数组、开辟内存地址来处理字符串
  • 本文将从字符串与字符数组的关系、字符串与内存的关系、字符串处理函数来讲解字符串。
  • 制作不易,欢迎收藏+点赞+关注,本人会持续更新

文章目录

  • 字符串与字符数组
    • 字符和字符串
    • 字符串与字符数组
      • 特点
      • 创建字符串两种形式
      • 字符串内存区域
    • 字符数组输入/输出
      • 输入
        • scanf
        • gets_s
        • getchar
      • 输出
    • 字符串处理函数(常用)
      • strlen
      • strcpy/strncpy
      • strcmp/strncmp/stricmp
      • strcat/strncat
      • strchr/strrchr
      • strstr
      • 其他(了解)
    • 内存相关的处理函数(常用)
      • memcmp
      • memcpy
      • memset

字符串与字符数组

字符和字符串

字符

  • 普通字符:‘a’,‘1’
  • 转义字符:‘\a’,‘\n’…

字符串

  • “Boy”,”Wy”

字符与字符串的区别

​ 1,形式上不同
​ 2,本质上:字符串有结束符 ‘\0’

在这里插入图片描述

字符A和字符串A所占内存空间不一样,以下代码输出分别是多少呢?

printf("%d %d", sizeof('a'),sizeof("a"));

答案:

1 2

解释:

  • char:内存是一字节,代表一个字符
  • ”a“,代表一个字符串,它含有一个字符’\0’,代表字符串结束,故等于2
  • 那请问:如果用strlen(“a”),又会输出多少呢??? 请看后面分析

字符串与字符数组

在各种编程语言中,字符串的地位都十分重要,C语言中并没有提供“字符串”这个特定类型,而是以特殊字符数组的形式来存储和处理字符串,这种字符数组必须以空字符’\0’结尾

特点

  • 字符数组可以没有'\0'
  • 字符串必须要有'\0'
  • 字符数组可以存储字符串

注意:字符串一定是字符数组,字符数组不一定是字符串

下列字符数组存储的是不是字符串:

 char str[10] = {'1','b','c'};		//并不是字符串,没有\0
 char str[1] ={'\0'};		 	    //是字符串 等价于””
 “abcdedf”; 			            //也是字符串,编译器会自动的在双引号最后加,上\0
 char str[10] =“abcdef"; 			//字符串可以用字符数组表示{'a','b'...'\0'}
 char str[10]={''a,,”b”,”c”,'\0'}	//不是字符串
 char *p=”maye”;			        //一个字符指针指向字符串

总结:

  • 编译器不会给字符数组自动添加’\0’

  • 编译器会自动给双引号的字符串字面值加上’\0’

  • 指针指向的字符串是常量,是没法修改的。

创建字符串两种形式

  • 字符数组形式:char str[20];
  • 字符指针形式:char* pc;

区别:

  • str是一个字符数组,字符串中的每个字符逐个存放,且可以随意修改
  • pc是一个字符指针,指向的是常量区的字符串,不能修改,只能访问
char  str[20];     str=“I love China!;    //(X) str是常量不能改变指向
char   *pc;        pc=“I love China!;     //(√) pc是变量,可以改变指向
  • 因此pc接受输入字符串时,要么指向一个字符串,要么开辟内存空间,

在这里插入图片描述

在这里插入图片描述

字符串内存区域

我们知道内存可以分为四区:

  • 栈区
  • 堆区
  • 全局区(静态区)
  • 代码区:存放二进制代码

其实在代码区和全局区之间还有一层文字常量区,用来存储字符串常量,生命周期随程序周期。

一下是某一位大佬写的,通过对比p1、p2、p3的内存区域,可以很明确的区别不同区的不同。

//main.cpp  
int a = 0; //全局初始化区  
char *p1; //全局未初始化区  
main()  
{  
	int b; //栈  
	char s[] = "abc";// 栈  
	char *p2;// 栈  
	char *p3 = "123456";// 123456\0在常量区,p3在栈上。  
	static int c =0//全局(静态)初始化区  
	p1 = (char *)malloc(10);  
	p2 = (char *)malloc(20);  
	//分配得来得10和20字节的区域就在堆区。  
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。  
}  

字符数组输入/输出

输入

scanf
  • 使用scanf输入字符串时,遇到空格会自动截断,遇到回车结束,自动添加’\0’
  • 输入超出范围时,不会进行越界检查,甚至能完全输出
gets_s
  • 能读取空格,遇到回车结束,自动添加’\0’
  • 输入超出范围时,会进行越界检查,如下图

在这里插入图片描述

getchar
char str[10];
for(int i=0;i<10;i++)
{
    str[i] = getchar();
}
puts(str);	//如果结尾没有'\0',输出结果将不可预料,可以改为逐个字符输出
  • 在结尾自动加上’\0‘,养成良好习惯,否则在很多情况会出现很多问题
for(int i=0;i<10;i++)
{
    str[i] = getchar();
    if(str[i] == '\n')
    {
        str[i] = '\0';
        break;
    }
}

输出

由于C语言中没有真正的字符串类型,可以通过字符数组表示字符串,因为它的元素地址是连续的,这就足够了。

1. 从首地址开始逐字节寻址,把存储单元(一个字节)内的数据转换为ASCII字符格式输出。
2. 直到某一个字节内存的元素为字符'\0'时,输出此字符并且寻址结束。

如果字符数组里没有’\0’,那么使用printf (%s) 输出时,就找不到正确的结束标志,就会多输出一些乱码。

在这里插入图片描述

字符串处理函数(常用)

C语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。 使用这些函数可大大减轻编程的负担。用于输入输出的字符串函数,在使用前应包含头文件"stdio.h",使用其它字符串函数则应包含头文件"string.h"。

strlen

求字符串长度**(不包括\0)**,包括可以用 sizeof关键字

strlen("hello maye");	

strcpy/strncpy

把一个src拷贝到dest中去,要保证dst缓冲区有足够的内存。

  • strcpy 会在dest结尾添加\0
  • strncpy 不会在dest结尾添加\0
char dest[10];
strcpy(dest, "maye");
puts(dest);

strcmp/strncmp/stricmp

比较str1和str2,str1 > str2 返回1,str1==str2 返回0,否则返回-1

int res = strcmp("maye", "maye");
printf("res:%d\n", res);

strcat/strncat

  • 把src连接到dest的末尾(\0的位置)
char dest[20]="hello ";
strcat(dest, "maye");
puts(dest);

strchr/strrchr

  • 在字符串string中查找字符val,存在返回val的开始位置,否则返回NULL
char words[] = "hello every one,My name's maye";
puts(strchr(words, 'o'));

strstr

char* strstr(char* _String, char * _SubString)

  • 在字符串string中查找子串substr,存在返回substr的开始位置,否则返回NULL
char words[] = "hello every one,My name's maye";
puts(strstr(words, "one"));

其他(了解)

算法:刷题的时候很常用

  • strlwr 把字符串转成小写

  • strupr 把字符串转成大写

  • strset/strnset 把字符串s中的所有字符都设置成字符c

  • strrev 反转字符串

  • strdup 拷贝字符串,返回动态分配的内存,使用完毕后需要手动free

内存相关的处理函数(常用)

memcmp

  • 内存比较,不仅可以比较字符串,还可以比较其他的内存
  • 返回值为三种情况 >0, <0 , =0
int arr[5] = { 1,2,6,4,5};
int arr1[5] = { 1,2,5,4,5 };
int ok = memcmp(arr, arr1, sizeof(int) * 5);
int ok1 = strcmp(arr, arr1);
printf("%d  %d\n", ok,ok1);

memcpy

  • 内存拷贝
int temp[5];
memcpy(temp, arr,sizeof(int)*5);
//strcpy(temp, arr);		//复制整型数组会有问题

for (int i = 0; i < 5; i++)
{
	printf("%d ", temp[i]);
}

memset

  • 字节对内存进行初始化
char num[5];
memset(num, 127, sizeof(char) * 5);
for(int i = 0; i < 5; i++)
{
	printf("%d ", num[i]);
}

nt temp[5];
memcpy(temp, arr,sizeof(int)*5);
//strcpy(temp, arr); //复制整型数组会有问题

for (int i = 0; i < 5; i++)
{
printf("%d ", temp[i]);
}


### memset

+ 按**字节**对内存进行初始化

```cpp
char num[5];
memset(num, 127, sizeof(char) * 5);
for(int i = 0; i < 5; i++)
{
	printf("%d ", num[i]);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Content-Encoding: br

爬虫的时候遇到了 Content-Encoding: br &#xff0c; 这可能会导致返回的数据有乱码&#xff0c;无法解析&#xff0c;也无法解码&#xff0c; 浏览器显示编码 按照这么写&#xff0c;还是乱码 查了很久&#xff0c;需要在请求头 Accept-Encoding 将这个改为gzip&#xff0c…

Swift 6.0 如何更优雅的抛出和处理特定类型的错误

概述 从 Swift 语言诞生那天儿起&#xff0c;它就不厌其烦一遍又一遍地向秃头码农们诉说着自己的类型安全和高雅品味。 不过遗憾的是&#xff0c;作为 Swift 语言中错误处理这最为重要的一环却时常让小伙伴们不得要领、满腹狐疑。 在本篇博文中&#xff0c;您将学到如下内容&…

企业数字化转型会面临哪些挑战,如何解决?

当前&#xff0c;数字技术发展迅速&#xff0c;已迈入 AI 人工智能时代。企业若不进行数字化转型&#xff0c;可能会被用户抛弃、被竞争对手超越。那么&#xff0c;传统企业在转型过程中会遇到哪些挑战呢&#xff1f; 一、企业数字化转型面临的挑战 1、缺乏明确的战略规划和转…

宠物空气净化器除臭吗?性价比高的宠物空气净化器十大排名分享

来来来&#xff0c;先带大家一睹我店里的小可爱们 是不是超级可爱呀~&#xff1f;这样的大卡车猫猫&#xff0c;在我这猫咖里可是还有好几十只&#xff01;作为一位坐拥几十只猫咪的“猫咖掌门”&#xff0c;朋友们总是投来羡慕的目光。但这份光鲜背后&#xff0c;可是有我无数…

轻松制作 GIF 动图,你也可以!

你是否曾为找不到合适的动图而烦恼&#xff1f; 是否羡慕别人能制作出精彩的 GIF 动图&#xff1f; 现在&#xff0c;无需再羡慕&#xff01;因为我们用以下图片中的方法&#xff0c;你自己也能轻松制作 GIF 动图。 这款工具&#xff0c;操作简单易懂&#xff0c; 即使你没有…

舞动奇迹,亨廷顿舞蹈症患者专属健身秘籍!

&#x1f308; 在小红书的温馨角落里&#xff0c;让我们一起探索一个特别的世界——为亨廷顿舞蹈症&#xff08;HD&#xff09;患者量身定制的健身之旅。HD&#xff0c;这个名字或许带着一丝沉重&#xff0c;但它绝不能定义我们生活的全部色彩。通过科学的锻炼方式&#xff0c;…

APP逆向百例五-Flutter逆向案例----某次元(AES+RSA)

现在售价依旧是99&#xffe5;,计划更新100案例&#xff0c;平均一个案例1块钱&#xff0c;要什么自行车&#xff01; 还原一下我逆向此app的方法 1.抓包分析&#xff1a; 我这边用socksDroid抓不到数据包,但是小黄鸟可以&#xff0c;那就用Reqable结合电脑端进行抓包,不纠结…

Leetcode 347. 前 K 个高频元素

解法&#xff1a; 字典统计排序 class Solution:def topKFrequent(self, nums: List[int], k: int) -> List[int]:cont {}for eve in nums:if eve not in cont: cont[eve] 1else: cont[eve] 1contlist sorted(cont.items(), keylambda x: x[1])res [eve[0] for eve i…

从安装Docker到打包迁移MySQL的完整指南

从安装Docker到打包迁移MySQL的完整指南 每一天过得充实&#xff0c;眼中无迷茫&#xff0c;心中无烦恼。日子就会充满希望&#xff0c;岁月就会洒满清欢。 这篇文章将带你从零开始&#xff0c;在CentOS服务器上安装Docker、使用Docker部署MySQL数据库&#xff0c;并打包和迁移…

凯迪仕智能锁携手唐百电器达成战略合作,市场布局和拓展再加速

近日&#xff0c;凯迪仕智能锁中国区总裁陈露拜访唐山百货大楼集团&#xff08;唐百电器&#xff09;&#xff0c;双方深入交流资源优势&#xff0c;结合唐山市场实际情况达成2024年-2025年度深度战略合作&#xff0c;并完成首次签约千余套凯迪仕智能锁战略目标&#xff0c;接下…

【java计算机毕设】中小型人力资源管理系统MySQL ssm vue maven项目设计源代码带项目报告 前后端可分离可不分离

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】中小型人力资源管理系统MySQL ssm vue maven项目设计源代码带项目报告 前后端可分离可不分离 2项目介绍 系统功能&#xff1a; 中小型人力资源管理系统包括管理员、人事管理员、普通人员三种角色。 管理员…

【JS】不使用BigInt实现大整数相加

前言 JS中整数有存储范围&#xff0c;一旦超出这个范围则会丢失精度&#xff0c;通过MAX_SAFE_INTEGER可以看到JS中支持的最大的、安全的正整数为9007199254740991。 JS新类型BigInt可以处理大整数运算&#xff0c;但这次不逃课&#xff0c;本文将尝试自行处理大整数相加&…

python安装包,2024最新Python下载环境配置教程!

一、Python安装包下载 1.进入Python官网下载&#xff08;如果不想去官网下载可以点击领取安装包&#xff09; Python官网主要有python的About (简介)、Downloads (下载)、Documentation(文档)、Community (团体)、Success Stories (成功案例)、News (新闻)、Events (事件动态…

Windows微调Qwen2-7B-Instruct-甄嬛

一、下载Anaconda 在下载Anaconda之前建议先将电脑原有的python卸载&#xff0c;避免造成冲突。 之后一直Next即可&#xff0c;不过要记得在环境变量中添加Anaconda&#xff08;在安装完成之前会有一个Add PATH选项&#xff0c;可以选上&#xff09; 安装完成之后打开CMD&…

3.2.5 宙之CPU的时分复用

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 3.2.5.1 __primary_switched开始构建0号进程 宙者&#xff0c;古往今来&#xff0c;时间为宙。盘古为了开天辟地&#xff0c;必须分开空间和时间。在时间维度&#xff0c;要对CPU的运行时间进行切分&#xff0c;…

netty编程之自定义编解码器

写在前面 源码 。 本文看下netty如何自定义编解码器。为此netty专门定义抽象类io.netty.handler.codec.MessageToByteEncoder和io.netty.handler.codec.ByteToMessageDecoder,后续我们实现自定义的编解码器就继承这两个类来做。 1&#xff1a;正戏 server 启动类&#xff1a…

卖一辆亏6万搞倾销,极越汽车高管掀了小米汽车遮羞布?

"炮轰解决不了极越销量问题" 作者 | 魏 强 编辑 | 卢旭成 8月22日早9点40分&#xff0c;极越汽车公关负责人徐继业发朋友圈炮轰小米汽车创始人雷军&#xff1a;“雷军这样的企业家&#xff0c;有点公德心和羞耻心好不好&#xff1f;每台车亏6万&#xff0c;亏那么…

Springboot中的mapper与entity难以觉察的匹配问题,困扰我几天时间,形成很大的压力!

最近&#xff0c;应好友邀请&#xff0c;替她做了一个心理疗愈项目的小系统&#xff0c;在编制后台API代码时&#xff0c;遇到了一个不易觉察的问题&#xff0c;终于查找出来&#xff0c;并且解决了&#xff0c;现奉献出来&#xff0c;供大家碰到类似问题&#xff0c;进行参考。…

面试题详解

前言&#xff1a;这一期我们专门来巩固所学知识&#xff0c;同时见识一些面试题。对知识做出一个总结。 1 不创建临时变量交换两个整数 . 第一种方法 #include<stdio.h> int main() {int a 0;int b 0;scanf("%d %d", &a, &b);printf("交换前…

中央空调安装8个标准流程指南

1、内机安装施工队进场第一步就是吊装内机&#xff0c;这里只要注意2个点就可以避免后续问题。 ① 内机离房顶距离不得小于1公分&#xff0c;避免机器运行时与墙顶产生共振。② 内机吊装需考虑百分之一的坡度&#xff0c;接冷凝水的一侧要稍微低一些&#xff0c;避免冷凝水排不…