成长之路---C语言笔记(构造类型之字符数组及字符串函数)

news2024/11/13 14:56:21

决不要停止自学,也不要忘记,不管你已经学到了多少东西,已经知道了多少东西,知识和学问是没有止境的一鲁巴金

字符数组

字符数组就是用于存放字符型数据的数组。在C语言中,字符串是作为字符数组来处理的,没有专门的字符串变量。字符串十分常用,因此C语言提供了许多专门处理字符串的函数。

字符数组的定义

字符数组是用于存放字符变量的数组,每个数组元素存放一个字符。字符数组的定义和数值型数组类似:

char 数组名[常量表达式];

与数值型数组相同,需要使用下标来访问字符数组元素,下标值0开始。

字符数组在内存中的存储

由于字符型和整型通用,也可以使用整型数组来存放字符数据,但这样浪费空间。同样也可以定义二维字符数组。

b[0]

b[1]

....

b[5]

.....

b[9]

1

h

y

字符数组的初始化

1.对数组元素逐个赋初值,这个方法与数值型数组类似

char c[10]={'c','v','b'};

最后一个数组元素没有赋初值,自动赋值为空字符(即'\0',其ASCII的值为0,是一个非打印字符)

2.用字符串初始化,c语言规定,可以将字符串直接赋值给字符数组用于初始化。

char c[12]={"hello world"};

事实上在实际运用过程中常省略花括号,甚至省略数组长度

char c[]={"hello world"};

注:存储长度为字符串中字符个数+1,因为'\0'作为结束字符也占一个长度。

字符数组只有在初始化时才能将整个字符串一次性地赋值,一定义完,就只能逐个字符赋值。

字符串与字符串结束标志

C语言中,用双引号引起来的内容为字符串常量。没有专门用于存储字符串变量的类型,字符串被存储在以空字符('\n')结尾的char类型的数组中。空字符用来标记字符串结束的位置,因此'\ 0'也被称为字符串结束标志或者字符串结束符。0'是ASCII码表中的第0个字符,英文称为NUL,中文称为“空字符”。该字符既不能显示,也没有控制功能,输出该字符不会有任何效果。有了空字符作为字符串的结束符,就不必再以字符数组的长度来判断字符串的长度值得注意的是逐个字符地给数组赋值初始化并不会自动添加'\0',需要我们人为地添加。

字符数组的引用和输入与输出

  1. 字符数组的引用

字符数组的引用即字符数组元素的引用,如同字符型变量的使用,可以被赋值,参与表达式运算或进行输入输出。例如:

char c[5];
c[0]='c';
c[4]=c[2]+5;
for(i=0;i<5;i++)
c[i]='a'+i;
for(i=0;i<5;i++)
printf("c[%d]=%c",i,c[i]);

我们可以使用for语句逐个输出同时在C标准库中也为我们提供了一些函数为我们整体输入输出,在下面的文章中我会写到。

字符串的输入

scanf()函数

使用scanf()函数和转换符%s可以读取字符串,读取时以第一个非空白符作为字符串的开始,以下一个空白符作为字符串的结束。空白符包括空行,空格,制表符或换行符。

char a[6];
scanf("%s",a);

注:scanf()函数的输入项a是一个已定义的字符数组名,输入的字符串应该短于定义的长度,系统自动加'\0',如果输入内容过长,scanf()也会造成数据溢出。此时我们可以指定宽度来防止溢出如:%10s

特别注明:在VS编译器中因为安全性问题在实际使用中我们需要使用是scanf_s()代替,具体使用方法类似,同样我们也可以使用#define _CRT_SECURE_NO_WARNINGS来忽略该问题。

get()函数

在我们使用scanf()函数进行输入时每次只能输入一个字符并且当遇到空格时输入就停止了,为了让我们可以一次性输入一个句子gets()函数就诞生了,事实上C11标准委员会已经将其废除在VS2022中我们已经不能使用了,这里我们介绍2了一些它的替代品。

fgets()函数

char *__cdecl fgets(char *_Buffer, int _MaxCount, FILE *_Stream)

它含有三个参数,其中第2个参数指明了读入字符的最大数量(特别注明包括'\0'),第三个参数指明要读入的文件,如果读入从键盘输入的数据,则以stdin1(stdin是C语言中标准输入流,一般用于获取键盘输入到缓冲区里的东西)作为参数,该标识符定义在stdio.h中。例如:

#include<stdio.h>
int main ()
{
    char a[SIZE];
    fgets(a,10,stdin);
    fputs(a,stdout);
    return 0;
 } 

gets_s()函数

char *__cdecl gets_s(char *_Buffer, rsize_t _Size)

它包含两个参数,第二个参数为读入字符的最大数量。

注:gets_s()只从标准输入中读取数据,所以不需要第3个参数,如果gets_s()读到换行符,会直接将其丢弃而不是储存,如果gets_s()读到最大字符数都没有读到换行符,会执行以下几步。首先把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直至读到换行符或文件结尾,然后返回空指针。接着,调用依赖实现的“处理函数”(或你选择的其他函数),可能会中止或退出程序。

字符串的输出

printf()函数

使用转换说明符%s即可输出字符串,输出时遇见结束符'\0'即停止输出。

#include<stdio.h>
int main()
{
    char a[] = "China";
    printf("%s", a);
    
    return 0;
}

puts()函数

用于将一个字符串或一个字符数组中存放的字符串(以'\0'结束的字符序列)输出到终端,并在末尾自动添加一个换行符,puts()函数常与gets()函数配对使用。

#include<stdio.h>
int main()
{
    char a[20] = "Input a string ";
    puts(a);
    fgets(a, 10, stdin);
    puts("This string is");
    puts(a);
    return 0;
}

注:puts()函数在遇见空字符时会停止输出,因此要确保含有空字符

char a[]={"a","c"}
//这种情况是不会自动添加'\0'

字符串处理函数

C语言函数库提供了多个处理字符串的函数,最常用的函数包括strlen(),strcpy(),strncpy(),strcat(),strcmp(),strlwr()和strupr()。其函数原型在头文件string.h中

strlen()函数

strlen()函数用于统计字符串的长度,即字符串中包含的字符个数,但不包括字符串结束符'\0'。字符串可以是字符数组,也可以是字符串常量

unsigned int strlen(char*str);//函数原型

#include<stdio.h>
int main()
{
    char str[20];
    fgets(str,20,stdin);
    printf("Length of\"%s\"is%d.\n", str, strlen(str));
    printf("Length of\%s\is%d.","abcdefg",strlen("abcdefg"));
    return 0;
}

注:输出双引号时采用了转义字符的表达方式

strcpy()函数和strncpy()

字符数组与数值型数组一 样,不能进行整体赋值和复制,只能对数组元素逐个赋值或复制 如果希望整体复制可以使用strcpy()函数

strcpy(字符数组1,字符数组2);
char* strcpy (char* szCopyTo, const char* szSource);
//函数原型

注:strcpy()函数用于将字符串或字符数组赋值到字符数组1中,包括赋值串后的字符串结束符'\0'。

strcpy()函数不会检查目标空间是否有足够容纳源字符串,而strncpy()可以指定复制的最大字符数。

stmcpy(字符数组1,字符串2,最大长度)
char* stmepy (char* szCopyTo, const char* szSource, int n);
函数原型

注: 如果字符串2的字符数小于n,那么复制整个字符串(包括空字符);复制的最大长度不能超过n,如果字符串2的字符数大于等于n,那么只复制前n个字符,不会复制空字符。空字符不一定要复制,需要时可以手动添加一个即可。

#define _CRT_SECURE_NO_WARNINGS//添加原因见上方
#include<stdio.h>
#include<string.h>
int main()
{
    char str1[20], str2[20] = "hello world";

    strncpy(str1, str2, 5);

    str1[5] = '\0';

        puts(str1);
    return 0;
}

strcat()函数

strcat()函数用于将字符串2连接到字符数组1的字符串后面,并返回字符数组1的起始地址,字符串2保持不变,它可以是字符数组或字符串常量。

strcat(字符数组1,字符数组2);
char*strcat (char* szAddTo, const char* szAdd);
//函数原型
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
    char str1[20], str2[10];

    printf("strl:");

    fgets(str1,20,stdin);
    printf("str2:");
    fgets(str2, 20, stdin);
    strcat(str1, str2);

    printf("str1: %s", str1);

    return 0;
}

注:strcat()函数不会检查字符数组 1的空间是否足够,程序员应当保证字符数组1的长度足以连接字符串2,否则会发生越界错误。当连接时,将字符数组1中字符串结束符'0'去掉,将字符串2的各字符依次连接到字符数组1的末字符后,并在新字符串的末尾再加上字符串结束符'\0'。

strcmp()函数

strcmp()函数用于比较字符串,若两个字符串相同,则返回0;当字符串1大于字符串2时,则返回个正整数:当字符串1小于字符串2时, 则返回一个负整数。字符串的比较从各自第一个字符开始,并进行逐个一一对应比较(按字符的ASCII 码值大小进行)。若前面的对应字符相同,则继续往后比较,直到遇上第对不同的字符, 并以这对字符的大小作为字符串比较的结果。字符串1和字符串2可以是字符数组或字符串常量。

strcmp(字符串1,字符串2);
int strcmp (const char* sz1, const char* sz2);
//函数原型
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
    printf("%d ",strcmp("abc", "abd"));
    printf("%d ",strcmp("abcd", "abc"));
    printf("%d ", strcmp("abc", "abc"));
    return 0;
}

注:若"ab"<"abd",则strcmp("abc", "abd")返回负整数;若"abed"> "abe",则strcmp("abed","abe" )返回正整数;若"abe"自己与自己相等,则stremp("abc", "abe")返回 0。大多数情况下,stremp()函数用于比较两个字符串是否相等或按字母顺序排序,返回的值具体是多少 并不重要。

strlwr()函数和strupr()函数

strlwr()函数是用于将指定字符串中的大写字母转换成小写字母并返回。

strupr()函数是用于将指定字符串中的小写字母转换成大写字母并返回。

strlwr(字符串)
char* strlwr (char* szToConvert);
//函数原型
strupr(字符串)
char* strupr (char* szToConvert);
//函数原型
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
    char str[20];
    fgets(str,10,stdin);
    printf("%s\n", _strlwr(str));
    fgets(str,20,stdin);
    printf("%s\n", _strupr(str));
    return 0;
}

最后的话 :如果大家觉得这篇文章对你们有帮助的话希望你们能够点点关注,你们的关注是我继续写下去的动力,谢谢大家。

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

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

相关文章

redis设计与实现读书笔记(2)

今天看的是关于单机数据库&#xff0c;RDB持久化以及AOF持久化的内容。 关于单机数据库 1.默认数据库数量 redis的服务器默认是会创建16个数据库&#xff0c;每个客户端访问的时候都要指定自己的目标数据库。 select可以切换目标数据库。 注意事项 到目前为止&#xff0c…

部署YUM仓库

文章目录 1. YUM仓库服务1.1 YUM概述1.1 准备安装源 2.制作YUM源2.1制作ftp源2.2 国内在线yum源2.3 本地源与在线源同时使用 3.yum软件包的下载方式4.yum的常用操作命令 1. YUM仓库服务 1.1 YUM概述 yum是一个基于RPM包&#xff08;是Red-Hat Package Manager红帽软件包管理器…

【Android入门到项目实战-- 6.1】—— 如何申请用户权限

目录 一、申请权限 1、布局文件 2、MainActivity类 3、AndroidManifest文件 你在使用安卓APP时可能经历过以下场景&#xff1a;使用APP的拍照功能时需要你授权使用相机。那么APP是如何完成申请权限功能的&#xff1f; 访问&#xff1a;https://developer.android.google.cn/…

ERTEC200P-2 PROFINET设备完全开发手册(9-2)

9.2 运行AC1/AC4参考代码 修改源代码usrapp_cfg.h的宏为 #define EXAMPL_DEV_CONFIG_VERSION 44 编译后下载到评估板运行AC4示例程序 在TIA中导入GSDML-V2.35-Siemens-ERTEC200pApp44-20210623.xml。新建项目&#xff0c;添加PLC和Devkit设备。 按照如下图所示配置模块&am…

2023零基础学软考网络工程师能过吗?

网络工程师是在计算机及其相关领域中拥有一定专业技能和知识的人员&#xff0c;可以为企业或个人设计、建设和维护计算机网络系统。网络工程师的职业前景非常广阔&#xff0c;尤其是随着信息化和互联网的迅速发展&#xff0c;网络工程师的需求也越来越大。软考是国家计算机技术…

Java多线程- synchronized关键字总结

目录 多线程锁的概要 Synchronized关键字 synchronized加锁过程 synchronized锁优化 锁消除 锁粗化 多线程锁的概要 首先对于锁的条件和要点进行一个总结: 锁使用来保护代码片段的, 以保证多线程的安全性, 一次只允许一个线程执行被保护的代码.锁可以管理视图进入被保护代…

malloc的一些知识

这是一个叫malloc的家伙&#xff0c;一直勤勤恳恳帮你为所欲为的玩转系统内存。可是长路漫漫&#xff0c;唯malloc作伴&#xff0c;我却不懂它。走近malloc&#xff0c;多了解一下总没错。 可能对我们来讲&#xff0c;malloc就是void* malloc (size_t len)&#xff0c;调用就是…

AcWing算法提高课-2.1.2城堡问题

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 题目传送门点这里 题目描述 1 2 3 4 5 6 7 #############################1 # | # | # | | ######---#####---#---#####---#2 # # | # # # # ##---#…

微信小程序的【运行机制】解读

文章目录 导语1.微信小程序的运行流程1.1 微信小程序的启动模式1.2 前台与后台的概念1.3 挂起1.4 微信小程序的销毁 微信小程序冷启动的页面从新启动策略 3.微信小程序热启动页面4. 退出状态注意点补充总结 导语 前面我们有章节给大家讲到了&#xff0c;微信小程序的生命周期钩…

Socket网络编程练习(C#)

Socket编程&#xff1a;两个窗口通信 本文章代码来自b站视频&#xff1a;【.Net零基础入门 (老赵主讲)-哔哩哔哩】 https://b23.tv/YI5VWaj 原视频发布者为传智播客&#xff0c;本人根据自己的学习进度对代码做了少许优化 一、网络编程前置知识 1.1 什么是网络编程 网络编程…

【Leetcode每日一刷】动态规划:509. 斐波那契数、322. 零钱兑换、300. 最长递增子序列

博主简介&#xff1a;努力学习的22级计科生博主主页&#xff1a; 是瑶瑶子啦所属专栏: LeetCode每日一题–进击大厂 前言&#xff1a;动规五部曲 以下是《代码随想录》作者总结的动规五部曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式&#xff0…

什么是异步,同步,并行,串行,单工,半双工,全双工通信

目录 1 如何理解“BUS总线” 2 通信方式的分类 2.1 串行通信Serial communication 2.1.1 异步传输Asynchronous serial communication 2.1.2 同步传输Synchronous serial communication 2.1.3 单工通信Simplex communication 2.1.4 半双工通信Half-duplex communication…

Unity API详解——Matrix4x4类

在脚本中通常用Vector3、QUaternion、Transform等类的属性和方法来对物体进行变换&#xff0c;Matrix4x4类通常在一些比较特殊的地方&#xff0c;如对摄像机的非标准投影变换等。本博客主要介绍Matrix4x4类的一些实例和静态方法。 文章目录 一、Matrix4x4类实例方法1、Multply…

机器学习实战教程(九):模型泛化

泛化能力 模型泛化是指机器学习模型对新的、未见过的数据的适应能力。在机器学习中&#xff0c;我们通常会将已有的数据集划分为训练集和测试集&#xff0c;使用训练集训练模型&#xff0c;然后使用测试集来评估模型的性能。模型在训练集上表现得好&#xff0c;并不一定能在测…

Redis源码分析(基于Redis7,对比Redis6)

PS: redis7.0.9版本的 1.Redis 源代码分类 1.1Redis 基本的数据结构 基础 Redis对象object.c字符串t_string.c列表t_list.c字典t_hash.c集合及有序集合t_set.c和z_set.c数据流 t_stream 底层实现结构 listpack.c 和 rax.c 简单动态字符串 sds.c整数集合 intset.c压缩列表 z…

【dp】最长递增子序列

文章目录 方法一&#xff1a;动态规划方法二&#xff1a;贪心 二分查找构造最长递增子序列 方法一&#xff1a;动态规划 dp[i]&#xff1a;末尾元素为arr[i]的最长子序列的长度 从0遍历到i - 1&#xff0c;若遍历到的元素小于当前值arr[i]&#xff0c;表示当前值arr[i]可以和…

国考省考行测:词句理解,词的对象指代,就近原则,主语一致法,语意语境分析上下文找出指代含义

国考省考行测&#xff1a;词句理解&#xff0c;词的对象指代&#xff0c;就近原则&#xff0c;主语一致法&#xff0c;语意语境分析上下文找出指代含义 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国…

3年100亿!苏宁易购与倍科达成重磅战略合作

紧抓消费复苏机遇&#xff0c;家电行业迎来重磅合作。4月20日&#xff0c;苏宁易购与国际知名家电品牌倍科在南京召开战略合作发布会&#xff0c;共同宣布升级战略合作伙伴关系。双方将围绕3年100亿战略合作目标开展独家品牌授权、发起“BIS”计划、打造生态开放平台、升级用户…

5G基站外市电改造建设方案 (ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 外市电定义及分类 定义&#xff1a;由供电部门提供的专用高压电源或非专用高压电源或低压电源均称为市电。分类&#xff1a; &#xff08;1&#xff09;按电压等级分类 ①提供…

贝叶斯学习(Bayesian Learning)基础篇

Bayesian Learning 前言Motivation and IntroductionThink about Spam Filtering.先验概率后验概率似然度边际概率 Basic assumptionRelevancePractical diculties Bayes TheoremProbability: random eventsBayesian Learning Maximum A Posteriori HypothesisBayes Optimal Cl…