一、字符串数组
1.字符串数组长度
char s[] = "hello";
s的长度 ---数组的长度 6
char s[10] = "hello";
s的长度 ---数组的长度 10
对于:h''e''l''l''o''\0'
它的字符串长度
'\0' 前面字符个数
"hello" 字符串长度 5个
它所占的内存空间的字节数是 6 个
// 字符数组的定义和使用
char arr1[5] = {'H', 'e', 'l', 'l', 'o'}; // 字符数组,不是字符串,没有null结尾
char arr2[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 字符数组,以null结尾,是一个字符串
// 字符串的定义和使用
char str1[] = "Hello"; // 字符串,编译器自动添加null结尾
char str2[10];
strcpy(str2, "Hello"); // 使用strcpy函数将字符串复制给字符数组,确保以null结尾
2.puts
int puts(const char *s);
功能:
将一个以null结尾的字符串输出到标准输出(stdout),并自动添加一个换行符('\n'
)。
int i = 0;
while(s[i] != '\0')
{
printf("%c",s[i]);
++i;
}
putchar('\n');
参数:
s //表示字符串 -- 指针类型
//字符数组名 s
//字符串常量 "hello"
返回值:
成功 非负数
失败 -1
注意:
puts输出时 自动会加 换行
puts("Hello, world!"); // 输出字符串 "Hello, world!" 并自动换行
char s[] = "hello";
puts(s);//输出字符数组s
二.字符串函数
头文件:<string.h>
1.strlen
size_t strlen(const char *s);
功能: 计算字符串长度
参数:
s :表示需要一个指针
可以给的参数形式
a.数组名
b.字符串常量
返回值: 返回字符串长度
计算字符串长度:
char a[20];
int i;
i = 0;
while(a[i] != '\0')
{
i++;
}
2.strcpy
char * strcpy(char *dest, const char *src);
功能:复制字符串,将src中字符串,复制到dest
参数:
src 表示原字符串 可以给的实参形式:a.一维字符数组名
b.字符串常量
dest 表示目的字符串,可以给的实参形式:一维字符数组名
3.strcat
将2个数组拼接起来可以用以下代码
char s1[20],s2[20];
printf("输入第一句:");
gets(s1);
printf("输入第二句:");
gets(s2);
int i,j;
i = 0;
j = 0;
while(s1[i] != '\0')
{
++i;
}
do
{
s1[i] = s2[j];
++i;
}while(s2[j++] != '\0');
为了更方便操作,我们接下来学习strcat数组拼接函数。
char *strcat(char *dest, const char *src);
功能:拼接字符串
参数:
dest 目的字符串
可以使用的实参形式
一维字符型数组名
src 源字符串
可以使用的实参形式
a.一维字符型数组名
b.字符串常量
用法:
char dest[100];
char src[100] = "world";
strcat(dest,src);
strcat(dest,"english");
4.字符串 比较规则
字符串比较的规则与其他语言中的规则相同,
即对两个字符串自左至右逐个字符相比(按 ASCII 码值大小比较),
直到出现不同的字符或遇到'\0' 为止。
如全部字符相同,则认为相等;
若出现不相同的字符,则以第1个不相同的字符的比较结果为准。
比较的结束的条件:
s1[i]!=s2[i] || s1[i]=='\0' || s2[i] == '\0'
只看,结束时,s1 最后一个字符 和 s2最后一个字符 之间的大小关系
5.strcmp
int strcmp(const char *s1, const char *s2);
功能: 比较字符串大小
参数:
s1 //字符串
s2 //字符串
数组名
字符串常量
返回值: //最后 停的位置上字符的差值 来反映大小。
strcmp的使用:
int n;
n = strcmp(s1,s2);
if(n > 0)
{
printf("s1大\n");
}else if(n < 0)
{
printf("s2大\n");
}else
{
printf("相等\n");
不用strcmp数组比较函数,代码可以这样写:
char s1[20],s2[20];
gets(s1);
gets(s2);
int i = 0;
for(i = 0;i < 20;++i)
{
if(s1[i] != s2[i] || s1[i] == '\0' || s2[i] == '\0')
{
break;
}
}
if(s1[i] > s2[i])
{
printf("s1大\n");
}else if(s1[i] < s2[i])
{
printf("s2大\n");
}else
{
printf("相等\n");
}
三、二维数组
1.二维数组
二维数组:类型说明符 数组名[常量表达式][常量表达式]
(1) (2) (3) (4)
说明 (1) 类型说明符 --- 用来说明数组中存储数据的类型 //
(2) 数组名 --- 标识符
(3) 常量表达式 --- 行 --多少行
(4) 常量表达式 --- 列 --多少列
scanf输入:
int a[3][3];
int i,j;
i = 0;
j = 0;
for(i = 0;i < 3;++i)
{
for(j = 0;j < 3;++j)
{
scanf("%d",&a[i][j]);
}
}
2.数组初始化:
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//全部初始化
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//全部初始化
int a[3][4] = {1,2,3,4,5,6};//部分初始化
int a[3][4] = {{1,2},{5,6},{9,10}};//全部初始化
3.二维数组的本质
注意:
1.c语言中,并不存在真正的二维数组,都是用一维数组模拟的。
2.二维数组的本质
实际上 一维数组类型的一维数组,数组的数组
3.二维数组数据存储时,
按行优先存储
二维数组的理解:
4.练习
将
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
置换为
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16 即:4*4数组,以对角线为对称,对角线2边进行置换。
int i,j;
i = 0;
j = 0;
int n = 0;
for(i = 0;i < 4;++i)
{
for(j = 0;j < 4;++j)
{
a[i][j] = ++n;
}
}
int temp;
for(i = 0;i < 4;++i)
{
for(j = i;j < 4;++j)
{
temp = a[i][j];
a[i][j] = a[j][i];
a[j][i] = temp;
}
}
for(i = 0;i < 4;++i)
{
for(j = 0;j < 4;++j)
{
printf("%d ",a[i][j]);
}
putchar('\n');
}