【C语言】字符数组的定义及使用
上篇文章讲述了二维数组的相关知识,本文我们接着来讲字符数组,和字符数组里要使用的一些函数,本文所有代码均匹配于VS环境下。
目录
一、前情介绍
字符型数据是以字符的ACSII代码存储在代码单元格中的,一般占一个字节。由于ASCII代码也属于整数形式,所以C99标准中,把字符类型归纳为整形类型中的一种。
二、怎样定义字符数组
用来存放字符型数据的数组称为字符型数组,在字符数组中一个元素内存放一个字符。定义字符型数组的方法与定义数值型数组的方法类似,例如:
char arr[10];
由于字符型数组是以整数形式存放的,也可以用整形数组来存放字符型数据,缺点就是浪费空间,一个字符只占一个字节,而一个整形数据占四个字节,将字符放在整形数组中会浪费空间。
三、字符数组的初始化
对字符型数组进行初始化,最容易理解的方法就是用“初始化列表” (这里的初始化列表在之前的数组的文章中进行过介绍,这里就不多进行描述),例如:
char arr[10]={'s','d','f','e','t','p','q','z','k','r'};
如果在定义字符数组时不进行初始化,那么数组中元素的值是不可预料的。如果花括号中提供的初值个数大于数组长度,则出现语法错误;如果初值个数小于数组长度,那么初值只会赋给前面的元素,后面的元素会自动赋值为空值,即‘ ’。
如果初值个数与预期个数相同,则可以省略数组长度,与之前的一维数组二维数组类似,当然字符型数组也有一维和二维之分。
四、字符串和字符串结束标志
在C语言中,字符串是被当作字符数组来处理的,在实际工作中,人们往往关心的是字符串的有效长度,而不是字符数组的长度。例如:定义一个字符数组长度为100,而字符串的长度为60。所以为了测字符串的实际长度,C语言规定了“字符串结束标志”,即‘ ’。
如果字符数组中有若干字符,前9个都不是空字符,而第10个是空字符,那么认为空字符之前是一个字符串,而字符串的有效字符为9个。
注意:C系统会在字符数组存储字符串常量时自动加一个‘ ’,作为字符串结束的标志,例如:“Cprogram”共九个字符,但其存放在一维数组中占10的字节,最后的‘ ’是系统自动加的。
对C语言处理字符串的方法有了了解之后,再补充一种字符数组初始化的方法,即用字符串常量来对字符数组进行初始化,例如:
char arr[]={"I am happy"};
char arr[]="I am happy";
以上两种方式均可,这里是用一个字符串作为初值,很显然这种方法直观,方便更符合人们的习惯。
五、字符数组的输入和输出
字符数组的输入输出可以有两种方法。
(1)逐个字符输入输出。用格式符“%c”输入或输出一个字符。
(2)将整个字符串输入或输出。用格式符“%s”输入或输出一整个字符串。
注意:
- 输出的字符串中不包括结束符“ ”。
- 用printf函数输出字符串时,输出项是字符数组的名字,而不是数组元素名。写成下面这样是不对的: printf("%s",arr[0]);
- 如果一个字符串包括一个以上结束符“ ”,则遇到第一个就输出结束。
- 可以用scanf输入一个字符串,输入项应是已定义的数组名,输入的字符串应短于已定义的字符数组的长度。
5.如果利用一个scanf函数输入多个字符串,则输入时应以空格分隔,例如:
scanf("%s%s%s",str1,str2,str3);
//输入数据How are you?
6.scanf函数的输入项如果是字符数组名,不要再加地址符“&”,因为再C语言中数组名代表数组中第一个元素的地址。
这是字符数组的相关内容,下一期进行字符数组相关函数的讲解,有需要的技术门持续关注,我会一直更新。
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击