二维数组
定义:
数据类型 数组名[第一维长度][第二维长度]
eg:int a[4][5],b[3][3];
二维数组的引用:数组名[下标一][下标二]
存储形式:按行进行存储(第一行每列存储完接下一行)
转置矩阵要注意:交换到主对角线即可,否则会出现两次交换,导致转置失败
字符串
计算机(Computer)是一种能够按照事先存储的程序,自动、高速地进行大量数值计算和 各种信息处理的现代化智能电子设备。 数值:int a,a[10] 信息:字符信息,如字符串
基本概念
字符串的典型应用
- 信息加密——密钥
- 词数统计——word文档
- 字符串匹配——搜索引擎
字符串数组不能被赋值
错误形式
char str[10];
str="student" ;
错误原因:数组名
str
是地址常量,不能用于赋值语句中。
//这是字符数组赋初值的方法,[]中省略了,据{}推算为7
char cArr[] ={'Q','U','A','N','X','U','E'};
//这是字符串赋初值的方法,[]中省略了,据{}推算为8,有「\0」
char sArr[] = "quanxue";
若无字符串结束标志/0
,则不能以%s
正确输出。
引入#include<string.h>
后,也不能用strlen()
求正确字符串长度。(strlen()
求字符串长度不包含/0
,而用sizeof()
求则包含)
总结:
- 字符数组即为字符类型的数组。
- 字符数组不一定是字符串。
- 字符串是最后一个字符为NULL字符的字符数组。
- NULL字符:
\0
- NULL字符:
- 字符串一定是字符数组。
- 字符数组长度固定,其中任何字符都可为NULL字符。
- 字符串只能以NULL结尾,其后字符不属于该字符串。
strlen()
等一些字符串函数对字符串完全适用,对不是字 符串的字符数组不适用。
字符串的输入输出
字符串输出:
%c
- 利用循环逐个字符输出
- 常用
for(i=0;str[i]!='\0';i++)
%s
- 输出「字符数组名」或「字符串常量」
printf("%s",str);
puts()函数
——建议使用puts(字符数组名或字符串常量);
- 作用:将字符串输出到显示屏上,遇第一个
\0
终止,并将\0
转换成\n
输出。 char str[]="hello";
puts(str);
字符串输入:
scanf()
函数一%s
- 使用
%s
,其对应项是字符数组名。不需要地址运算符&
,数组名即为地址常量。char name[20];
scanf(“%s",name);
- 不足:
- 当遇到空格时,
scanf()
的输入操作将中止。(输入时可用空格分隔需要输入的两个字符串) - 无法使用
scanf
输入一个包含空格的字符串。
- 当遇到空格时,
- 使用
gets()函数
gets(字符数组名)
作用:读入一个字符串(包括空格)到指定数组中,遇到换行符(如回车),用
\0
代替换行符。例如:
char name[100];
gets(name);
puts(name);
运行示例:
abcd ef abcd ef Press any key to continue
ASCII码中英文大小写之间相差32。
字符串处理函数—说明在头文件「string.h」中
strlen()
strcmp()
strcpy()
strcat()
strlen(数组名);
求字符串长度(字符串中字符的个数),到\0
为止,不计\0
。
strcmp(数组名1,数组名2);
字符串比较函数:对「数组名1」和「数组名2」进行逐个字符的 ASCII 码比较,直到对应 字符能够确定大小关系或到串尾为止。
比较结果 | strcmp的值 |
---|---|
str1<str2 | -1 |
str1==str2 | 0 |
str1>str2 | 1 |
strcpy(数组名1,数组名2 or 字符串常量);
字符串拷贝函数:将「字符数组2 or 字符串常量」拷贝到「字符数组1」中,包括\0
例如:
char s1[80],s2[80];
gets(s2);
strcpy(s1,s2);
strcpy(s1","Program");
利用该函数可以实现字符串的赋值操作(因赋值符号=
左侧应为一个变量)
strcat(数组名1,数组名2 or 字符串常量);
字符串连接函数:将「字符数组1」中的字符串的结束标记字符 取消,然后,将「字符数组2 or 字符串常量」加到它之后。「字符数组2 or 字符串常量」保持不变。
利用该函数可实现两个字符串的拼接。
字符串应用
加密
以凯撒加密为例:
- Step1:输入任意
字符串s
- Step2:对字符串进行
凯撒加密k
重复下述操作,直到字符串中所有的字符都处理完毕
- Step2.1:如果
s[i]<'z'-k或s[i]<'Z'-k
,则s[i]=s[i]+k
- Step2.2:否则,
s[i]=s[i]+k-26
(有26个英文字母)
- Step2.1:如果
Step3:输出
字符串s
。
词数统计
- Step1:输入任意
字符串s
- Step2:新词标志
word =0
,词数统计num=0
Step3:重复下述操作,直到
s
的所有字符比较结束- Step3.1:如果
s[i]
等于空格,则说明前一个词结束,word=0
,输出回车。 - Step3.2:否则,输出
s[i]
,判断 word 是否为 0,- 是,前一字符为空格,新词开始,
word=1,num++
- 是,前一字符为空格,新词开始,
- Step3.1:如果
Step4:输出字符串中的单词数。
字符串匹配
简单引例:给定一个主串 s
和一个子串 t
,在主串 s
中寻找子串 t
的过程称为字符串匹配,也称为模式匹配,如果匹配成功,则输出子串t中第一个在主串s中的序号。
- Step1:初始化
主串s
和子串t
的起始下标i=0、j=0;
初始化比较的起始位置start=0
- Step2:重复下述操作,直到s或t的所有字符比较结束
i=start;
- 如果
s[i]==t[i]
,则继续比较s
和t
的下一对字符 - 否则,将
start
后移 1 位,将i
和j
回溯,准备下一次比较
Step3:如果t
中所有字符都比较完毕,则输出start
对应的序号;否则,输出匹配失败的提示信息。