08-C语言学习-字符串数组,二维整形数组
2026/7/29 6:40:23 网站建设 项目流程

两个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(),需要取地址符
}
}

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询