当前位置: 首页 > news >正文

08-C语言学习-字符串数组,二维整形数组

两个if,两个if互不干扰,并行判断;if与else if只会触发其中一个
一维字符型数组
C语言没有字符串型数据,操作和存储字符串要使用字符型数组来进行。
定义:
数据类型 数组名[元素个数] = { }; char str[] = "hello world\0",需要12个,有一个空格和\0
元素个数必须为常量,
元素数量必须足够确保能够存下字符串末尾的\0字符。
数组元素的访问:
char str[20]; char str[12];

str[0]; str[0] = 'h';
str[1]; str[1] = 'e';
... ...
str[19]; str[11] = '\0';
\0不需要输入,默认会存
数组的存储
初始化
char str[] = "hello world"; (默认初始化,根据定义的字符个数+1分配空间,不建议使用)
// 数组长度自动为12:h e l l o w o r l d \0

char str[12] = "hello world";

char str[12] = {'h','e','l','l','o',' ','w','o','r','l','d','\0'};

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

char str[6] = {0};字符串清0,可以存其他的了,不带""以及''!

先定义、后续逐个下标赋值:剩余空间是垃圾,不会自动产生 \0;
定义时大括号初始化:没写的元素自动置 0(不是字符,是二进制0,恰巧的是\0的二进制也是0);
只要要当作字符串使用(% s、strlen、strcpy),必须确保存在 \0,不能赌内存巧合。

字符串的打印
printf("%s");
持续逐个字节输出,直到读到 \0 才停止。
缺少 \0 → 内存越界,字符数组,无 \0 → % s 高危
传入指针指向的内容中途出现 \0,输出被截断
puts()
会在字符串末尾多打印一个\n字符

注意:以上只能打印字符串不能打印整形数组,整形数组依然要用for循环

赋值
同整形数组赋值,一个一个来

接收
char str[32] = {0};
scanf("%s", str); //字符串接收不需要加取地址符&,scanf接收字符串自带循环
//接收不到空格,scanf认为空格是结束的标志

gets(str); //以回车为结束。
gets() 读到换行 \n 时,直接丢弃换行,不会存入缓冲区,末尾自动补上 \0。

fgets(字符串名, 数组大小, stdin); *会保存回车*
fgets(str, sizeof(str), stdin); //stdin=standard input=标准输入流,输入设备,默认键盘
stdin 标准输入 → 键盘(程序读数据)
stdout 标准输出 → 屏幕(程序打印数据,printf 默认 stdout)
stderr 标准错误 → 屏幕(打印报错信息)

strlen(); //统计字符串中字符的数量 (使用需要引入新的头文件string.h)
返回无符号long
sizeof(); //统计字符串所占空间的大小与定义有关
返回无符号int

\0常作为终止符号,SACII为0(二进制的0),不同与字符'0','0'的ASCII码为48
本身可以使用for循环对字符串进行遍历读取出,但无法在终端中显示出
(不是空格或换行,是完全不显示)

char str[] = "abc\0123";
printf("%s", str); // 只输出 abc
printf("长度:%zu", strlen(str)); // strlen只算到第一个\0,结果=3
%s、strlen、strcpy 等字符串工具:遇见第一个 \0 直接终止,后面内容失效;

char s1[] = "abc\0123"; // 中间1字节ASCII 0,截断%s
char s2[] = "abc\\0123"; // \ 和 0 两个普通字符,不会截断,\\用于输入反斜杠符号

键盘输入无法输入\0,会被识别为'\'与'0',对应'\\'与'0',字符串中插入\0只能单个赋值。

strcpy(); //字符串拷贝函数
strcpy(目标字符串,源字符串名);
//目标字符串定义的大小一定要>=源,因为strcpy会不断将源所有字符赋值到目标,如果源字符串长度 ≥ 目标数组容量,会越界写入,破坏内存。
strcpy(dest, src);
// 一直复制到 \0,不限制长度,容易溢出

strncpy(dest, src, size);
// 最多复制size个字节;
// 注意:如果size耗尽还没读到\0,dest末尾**不会自动追加\0**!

strcat(); //字符串拼接
strcat(目标,要拼接的内容);内容可以为字符串变量名或字符串
strcat(str, str2);
strcat(str, "worlsd");
注意:目的空间一定要存放的下拼接后的字符串。

字符串的比较 strcmp();
strcmp(str1,str2); //比较两个数组中的字符串是否一样(\0之前的值),而不是字符串的大小
结果,3种值(有符号int)
0; 两个字符串相同;
大于0的值表示,第一个字符串大于第二个字符串
小于0的值表示,第一个字符存小于第二个字符串
从左到右,比较两个字符串的字符,直到ASCII码不同,第一个字符码减去第二个字符码,并返回

二维整形数组
数组定义
由一维数组构成的一维数组,一维数组的一维数组
数据类型 数组名[行数][列数]
行数,列数必须为常量
初始化
全部初始化
int a[2][3] = {1,2,3,4,5,6};
int a[2][3] = {{1,2,3},{4,5,6}};

局部初始化
int a[2][3] = {1,2,3,4}; 局部初始化没有给的值为0
int a[2][3] = {{1,2},{4}}; 同上
int a[2][3] = {0};或{{0}}

默认初始化, 可以不写行,但必须写列
int a[][3] = {1,2,3,4,5,6}; 2行3列
int a[][3] = {1,2,3,4}; 2行3列
int a[][3] = {{1,2},{4}}; 2行3列


定位,赋值:数组名[行标][列标] = n;
使用内嵌双for循环对二维数组进行遍历
for 行
{
for 列
{
语句块
可以接收数据
scanf(),需要取地址符
}
}

单一性,连续性,有序性(从左到右,从上到下,先行后列)

http://www.jsqmd.com/news/1285628/

相关文章:

  • 手动排查木马实战指南:从进程、服务到日志的七维深度剖析
  • 上海有哪些值得选的GEO优化服务商?
  • 贵阳正规的外墙渗水企业
  • 蓝桥杯Java B组省赛:从环境配置到核心算法的实战指南
  • 2026年6月广州市南沙区二手房价格深度分析
  • 物联网硬件安全方案:SE050芯片与MK24FN微控制器的协同防护
  • Langchain框架解析:构建大语言模型应用的核心技术
  • XSS-labs靶场实战:从原理到绕过技巧的Web安全入门指南
  • 构建专属GPT-3 API代理:从架构设计到RAG集成的完整实践
  • 刷题笔记:力扣第707题-设计链表
  • STM32 PWM频率与占空比计算原理:从定时器时钟到参数配置实战
  • 2026年来内蒙古游玩必打卡 这款口碑超好的本土特色鸡品牌一定要尝
  • C语言动态内存通讯录实现:从malloc到realloc的完整项目指南
  • C++内存管理:从基础概念到智能指针与内存池实战
  • 本地部署开源远程桌面网关 Next Terminal 并实现外部访问
  • 标杆案例:仅靠3台设备,如何撑起800人的自救器盲戴考核?
  • IMU模块:从陀螺仪到多传感器融合的姿态感知技术详解
  • Qt自定义控件开发:提升法实战详解与避坑指南
  • 用纸开啤酒瓶:材料力学与杠杆原理的应急生活技巧
  • Meta Quest MR开发实战:用模板缓冲实现虚实融合的门窗效果
  • 智能插座选购配置全攻略:从Wi-Fi协议到自动化场景实战
  • MMDetection v2.22.0 实战:从零训练自定义目标检测模型
  • 金融CSV数据分析:移动均线、异常点检测与收益回撤可视化
  • ESP32开发中模块选择与配置全解析:从硬件识别到环境配置实战
  • Arduino按键自锁与状态机实现:从消抖到稳定状态切换
  • Fluent多孔介质模型:催化器仿真从原理到工程实践全解析
  • PHP扩展安全与无字符RCE绕过:从CTF题看纵深防御
  • 分布式光伏发展现状与选型要点解析
  • Grid++Report脚本实战:5大场景实现动态字段计算与报表逻辑控制
  • Java开发环境搭建:从JDK安装到多版本管理的完整指南