C语言基础--基本数据类型

基本数据类型

前言

本文主要介绍了数组,字符串相关函数和结构体

数组

数组是一组有序的,类型相同的集合,这些数据存储在一块连续内存中,这些数据被称为数组的元素

一维数组的定义

定义数组只需要在命名后加上\[\] 就可以,eg:

定义一个含有10个元素的数组:int arr10

需要注意的是,因为数组是一块连续的内存地址,所以定义数组的时候需要指明数组大小,否则会报错

定义其他类型数组:

数组的类型可以是任何一种基本数据类型或构造数据类型

数组名代表数组的起始地址,可以用字母,数字和下划线命名,但是同样的无法用数字作为数组开头。

数组的长度一般只能是常量和常量表达式,但是在C99标准中增加了变长数组,可以用一个int变量作为数组的长度创建数组,但是需要注意的时,变长数组定义后无法改变数组长度,和正常定义的数组区别为:普通数组在编译期间分配内存,变长数组在运行期间分配内存

数组必须先定义后使用,因为如果未定义数组,那么内存中没有对应的连续内存,数据没有保存的地方

如果数组定义后没有赋值,那么数组可能存放随机的数据,大概率会是0

数组在定义后占用的内存大小为定义数组的数据类型*数组大小。例如使用int定义一个大小为10的数组,那么内存中会分配一个大小为4 * 10 字节的连续空间。

根据这点可以根据数组占用内存大小/数据类型来获取数组的大小。

一维数组的初始化

可以在定义数组时直接初始化。eg:

如果只赋值几个数而不全部赋值,那么数组剩下的未赋值元素会全部变为0, 字符串数组会直接赋空值

也可以只赋一个0值,这样数组中所有元素都会变为0,字符串数组会全部为空

数组的使用

数组元素由下标标识,不能直接整体使用,下标从0开始,数组从左往右第一个数据下标为0, 然后依次为1,2,3...

也可以使用-1来访问倒数第一个元素,-2倒数第二个,然后依次到第一个元素

多维数组

多维数组相当于让每个一维数组的元素也是一个数组,在一维数组中,使用下标来访问数组元素,当访问的元素为一个数组时,使用这个数组的下标可以访问到对应数据,访问一维数组arr0第一个元素,访问二维数组的第一个元素就是arr00

定义二维数组可以直接向一维数组一个直接赋值,赋值下标顺序为:00 01 02 03 04 11 12 13...

字符串二维数组就是数组中每一个元素都是一个字符串。

字符串常用函数

注意:使用下面所有函数都需要添加头文件string.h

strcpy

将一个字符串复制到另一个字符串中,包括结束符'\0'

语法:

char *strcpy(char *dest, const char *src);

参数:dest为目标字符串的指针 src为源字符串的指针

返回值:返回目标字符串dest的指针

strncpy

这个函数和strcpy类似, 但是这个函数可以自定义需要复制多少个字符

语法:

char *strncpy(char *dest, const char *src, size_t n);

参数:dest为目标字符串的指针 src为源字符串的指针 n要复制的最大字符串

返回值:返回目标字符串dest的指针

当复制的字符串小于目标字符串大小时,空余位置会直接赋空

如果n⼩于变量允许的字符数量,那么就要留意给字符数组设置⼀个结束字符\0,建议再定义字符数组时就进⾏初始化,不然有可能会输出乱码

strcat

将源字符串连接到目标字符串的末尾,覆盖目标字符串的'\0'并在末尾添加一个新的'\0'

语法:char *strcat(char *dest, const char *src)

返回目标字符串的指针

注意:目标字符串需要满足合并后的空间大小,否则会报错

strcmp

比较两个字符串,如果相等返回0, 如果参数1小于参数2,返回小于0, 如果参数1大于参数2,返回大于0;

int strcmp(const char *s1, const char *s2)

strlen

统计字符串的长度,但不包括结束符'\0'

strchr

在字符串中查找第一次出现的指定字符,返回指向它的指针,未找到返回NULL

char *strchr(const char *s, int c)

strcspn

计算在⽬标字符串中不包含指定字符集合的字符数,直到遇到第⼀个出现在该字符集合中的字符为⽌。

返回开始位置到指定字符(不包含)之间的字符数, 如果不存在则返回字符串长度

size_t strcspn(const char *str1, const char *str2)

snprintf

按指定格式拼接字符串,比strcat自由度更高

int snprintf(char *buf, size_t len, char *format, ...)

参数1,保存字符串的缓冲区, 参数2, 缓冲区大小, 参数3 ,拼接格式, 后面就是参数列表

sscanf

将字符串按空字符拆分成若干份,然后没个部分存入指定内存中

int sscanf(char *buf, char *format, ...)

返回int类型值保存匹配的项数

相关推荐
Chester_19996 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
EXI-小洲7 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
会周易的程序员7 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导7 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan7 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
m0_695251498 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
是隼人8 小时前
buuctf-pwn xdctf2015_pwn200题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
大衛說9 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
可乐鸡翅yeah_10 小时前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线
2601_9622035110 小时前
Java进阶07集合(续)
java·开发语言